【发布时间】:2021-06-29 13:38:41
【问题描述】:
我对这个弹性搜索和 Spring Boot 世界很陌生,过去 2-3 天我一直在尝试搜索这个解决方案,遗憾的是我无法(可能是因为我是新手)。
我在弹性搜索中有 3 列,第一列是 ID,第二列是名称(我在此基础上创建自动完成 API),第三个字段包含一组称为数字的数字。我的用例是,对于第 3 列中的特定数字,我想要来自第 2 列的自动完成建议。
这是我用这段代码实现的,它可以工作:repo.findByNumbersAndName(String, String)
但这不允许我设置模糊性、通配符查询和其他搜索参数,所以我尝试使用 QueryBuilders 但我在构建逻辑方面没有成功(我基本上尝试使用 BooleanQueryBuilder),所以如果有人可以帮助我,它会真的很有帮助!
Spring Boot 版本 - 2.4.2
提前致谢。
编辑1:-
为了更好地理解我的用例,假设这是我存储在弹性搜索中的内容
Id | Name | Numbers |
-----------------------
a1 | ashwin | 1 |
a2 | Ram | 3 |
a3 | Kumar | 2 |
a4 | Some | 2 |
a5 | body | 1 |
a6 | any | 3 |
a7 | one | 4 |
a8 | ashwin | 2 |
现在我应该有控制权来指定我的查询,说对于这个数字(比如说 1),如果输入自动完成“a”,自动完成的可能性是什么。然后程序应该只在数字列中搜索数字为“1”的可能性,因此在这种情况下,只有一个输出是“ashwin”。
编辑2:-
我相信我的配置和查询方法和你所做的一样,我只是粘贴我所做的。一个更新是,虽然数据库中的 Number 字段包含 Integers,但它们存储为 String 数据类型,这在 term Query 时会有什么不同吗?
这是我的 elastic-analyzer.json
{
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 30
}
},
"analyzer": {
"autocomplete_search": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"stop"
]
},
"autocomplete_index": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter",
"stop"
]
}
}
}
}
我正在使用它来生成查询:-
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("Number", number))
.must(QueryBuilders.matchQuery("Name", search_word));
以上以这种格式生成查询-
{
"bool" : {
"must" : [
{
"term" : {
"Number" : {
"value" : "1",
"boost" : 1.0
}
}
},
{
"match" : {
"Name" : {
"query" : "ash",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
这是产生空数组,不明白为什么?我觉得下面的属性相当于你在索引映射中提到的属性
@Id
@Field(type = FieldType.Text)
private String Id;
@Field(type = FieldType.Text, analyzer = "autocomplete_index", searchAnalyzer = "autocomplete_search")
private String Name;
@Field(type = FieldType.Text)
private String Number;
感谢@ESCoder
编辑 3:-
在@ESCoder 的帮助下,我也偶然发现了这一点,
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("Number", search_number).boost(1f).operator(Operator.AND))
.must(QueryBuilders.matchQuery("Name", keyword).boost(0.4f));
这是为 ElasticSearch 生成的 Query spring,
{
"bool" : {
"must" : [
{
"match" : {
"Number" : {
"query" : "1",
"operator" : "AND",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
},
{
"match" : {
"Name" : {
"query" : "ash",
"operator" : "OR",
"fuzziness" : "1",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 0.4
}
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
}
【问题讨论】:
标签: java spring spring-boot elasticsearch full-text-search