我在ElasticSearch中使用模糊搜索选项。它太酷了。

但是在搜索具有空格的值时遇到了一个问题。例如说我有两个值:

"Pizza"
"Pineapple Pizza"

然后使用以下查询搜索披萨:
        client.search({
            index: 'food_index',
            body: {
                query: {
                    fuzzy: {
                        name: {
                            value: "Pizza",
                            transpositions: true,
                        }
                    },
                }
            }
        })

返回的值是:
"Pizza"
"Pineapple Pizza"

这是预期的。但是,如果我在查询中输入值“Pineapple Pizza”:
        client.search({
            index: 'food_index',
            body: {
                query: {
                    fuzzy: {
                        name: {
                            value: "Pineapple Pizza",
                            transpositions: true,
                        }
                    },
                }
            }
        })

返回的值是:
""

空的

这是为什么?应该是完全匹配。
我正在考虑将所有带有空格的名称切换为下划线。因此,“Pineapple Pizza”将是“Pineapple_Pizza”(此解决方案适用于我)。但是我问这个问题是希望找到更好的选择。我在这里做错了什么?

最佳答案

模糊查询是术语级查询。这意味着在匹配文档之前不会对搜索到的文本进行分析。在您的情况下,在字段名称上使用标准分析器,该分析器将“Pineapple Pizza”(菠萝比萨)分为两个标记菠萝和比萨。模糊查询正在尝试将搜索文本“Pineapple pizza”与索引中的任何相似词进行匹配,并且整个单词pineapple pizza的索引中都没有条目(它分为两个单词。)

您需要使用设置了模糊性的match query来分析查询字符串

{
  "query": {
        "match" : {
            "item" : {
                "query" : "Pineappl piz",
                "fuzziness": "auto"
            }
        }
    }
}

回复 :
 [
      {
        "_index" : "index27",
        "_type" : "_doc",
        "_id" : "p9qQDG4BLLIhDvFGnTMX",
        "_score" : 0.53372335,
        "_source" : {
          "item" : "Pineapple Pizza"
        }
      }
    ]

您还可以在keyword字段上使用模糊性,该字段将整个文本存储在索引中
{
  "query": {
    "fuzzy": {
      "item.keyword": {
        "value":"Pineapple pizz"
      }
    }
  }
}

编辑1:
{
  "query": {
        "match" : {
            "item" : {
                "query" : "Pineapple pizza",
                "operator": "and",
                "fuzziness": "auto"
            }
        }
    }
}

“operator”:“and”->查询中的所有 token 必须存在于文档中。
如果存在任何一个 token ,则默认值为OR。还有其他可能的组合,您可以在其中定义百分号应匹配的 token 数

09-20 20:49