我对这个ElasticSearch和spring boot的世界还很陌生,从过去的2-3天我一直在尝试寻找这个解决方案,遗憾的是我没能找到(可能是因为我对这个还不熟悉)。
我在elastic search中有3列,第一列是id,第二列是name(我正在创建autocomplete api),第三列是数字集numbers。我的用例是,对于第3列中的特定数字,我需要第2列中的自动完成建议。
我用这段代码实现了这一点,它可以工作: repo.findByNumbersAndName(String, String)
但这不允许我设置模糊性、通配符查询和其他搜索参数,所以我尝试使用QueryBuilder,但在构建逻辑方面并不成功(我基本上尝试使用booleanquerybuilder),所以如果有人能在这方面帮助我,那将是非常有帮助的!!
spring boot版本-2.4.2
提前谢谢。
编辑1:-
为了更好地理解我的用例,假设这是我在ElasticSearch中存储的内容
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),如果输入autocomplete“a”,自动完成的可能性是多少。然后程序应该只搜索数字列中数字为“1”的可能性,因此在这个场景中只有一个输出是“ashwin”。
编辑2:-
我相信我的配置和查询方法和你做的是一样的,我只会粘贴我做的。一个更新是,虽然数据库中的number字段包含整数,但它们存储为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
}
这是产生空数组,不明白为什么?我觉得下面的属性相当于您在索引Map中提到的属性
@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生成的查询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
}
}
1条答案
按热度按时间6fe3ivhb1#
添加索引数据、Map、搜索查询和搜索结果的工作示例
索引Map:
索引数据:
搜索查询:
搜索结果:
更新1:
使用当前的索引Map设置,将为
ashwin
```GET /_analyze
{
"analyzer" : "autocomplete",
"text" : "ashwin"
}
{
"tokens": [
{
"token": "ash",
"start_offset": 0,
"end_offset": 6,
"type": "",
"position": 0
},
{
"token": "ashw",
"start_offset": 0,
"end_offset": 6,
"type": "",
"position": 0
},
{
"token": "ashwi",
"start_offset": 0,
"end_offset": 6,
"type": "",
"position": 0
},
{
"token": "ashwin",
"start_offset": 0,
"end_offset": 6,
"type": "",
"position": 0
}
]
}