【问题标题】:ElasticSearch - fuzzy search java api results are not properElasticSearch - 模糊搜索 java api 结果不正确
【发布时间】:2018-10-05 17:10:00
【问题描述】:

我已在 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 elasticsearch elastic-stack


    【解决方案1】:

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

    更新 1

    fuzzy query 是一个term 查询,而match query 是一个全文 查询。

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

    【讨论】:

    • 我在我的查询中更新了相同的内容。请在我的问题本身中找到我更新的查询。它不工作。
    • 你不应该将fuzzyQuery 传递给matchQuery,你可以使用matchQuery(...).fuzziness(Fuzziness.TWO).prefixLength(0) 或这样的东西
    • 也尝试将.operator(Operator.AND)) 设置为您的matchQuery
    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 2015-11-11
    • 2020-06-18
    • 2019-01-18
    • 2014-04-30
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多