ElasticSearch - 模糊搜索 Java API 结果不正确



我已经在 elasticsearch 中索引了示例文档,并尝试使用模糊查询进行搜索。但是当我使用 Java 模糊查询 API 进行搜索时,我没有得到任何结果。

请在下面找到我的映射脚本:

PUT productcatalog
{
"settings": {
"analysis": {
"analyzer": {
"attr_analyzer": {
"type": "custom",
"tokenizer": "letter",
"char_filter": [
"html_strip"
],
"filter": ["lowercase", "asciifolding", "stemmer_minimal_english"]
}
},
"filter" : {
"stemmer_minimal_english" : {
"type" : "stemmer",
"name" : "minimal_english"
}
}
}
},
"mappings": {
"doc": {
"properties": {
"values": {
"type": "text",
"analyzer": "attr_analyzer"
},
"catalog_type": {
"type": "text"
},
"catalog_id":{
"type": "long"
}
}
}
}
}

请找到我的示例数据。

PUT productcatalog/doc/1
{
"catalog_id" : "343",
"catalog_type" : "series",
"values" : "Activa Rooftop, valves, VG3000, VG3000FS, butterfly, ball"
}

PUT productcatalog/doc/2
{
"catalog_id" : "12717",
"catalog_type" : "product",
"values" : "Activa Rooftop, valves"
}

请找到我的搜索脚本:

GET productcatalog/_search
{
"query": {
"match" : {
"values" : {
"query" : " activa rooftop VG3000",
"operator" : "and",
"boost": 1.0,
"fuzziness": 2,
"prefix_length": 0,
"max_expansions": 100

}
}
}
}

我得到上述查询的以下结果:

{
"took": 239,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.970927,
"hits": [
{
"_index": "productcatalog",
"_type": "doc",
"_id": "1",
"_score": 0.970927,
"_source": {
"catalog_id": "343",
"catalog_type": "series",
"values": "Activa Rooftop, valves, VG3000, VG3000FS, butterfly, ball"
}
}
]
}
}

但是,如果我使用以下Java API进行相同的模糊搜索,则无法从中获得任何结果。

请在下面找到我的Java API查询以进行模糊搜索:

QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.fuzzyQuery("values", keyword).boost(1.0f).prefixLength(0).maxExpansions(100));

更新 1

我已经尝试过以下查询

QueryBuilder qb = QueryBuilders.matchQuery(QueryBuilders.fuzzyQuery("values", keyword).boost(1.0f).prefixLength(0).maxExpansions(100));

但是我无法在matchQuery内传递QueryBuilders.在编写此查询时收到此建议The method matchQuery(String, Object) in the type QueryBuilders is not applicable for the arguments (FuzzyQueryBuilder)

提到的java查询不是match查询。这是一个must查询。您应该使用matchQuery而不是boolQuery().must(QueryBuilders.fuzzyQuery())

更新 1

模糊查询是术语查询,而匹配查询是全文查询。

另外不要忘记,在匹配查询中,默认运算符是运算符or您应该将其更改为and,就像您的 dsl 查询一样。

最新更新