我在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”(此解决方案适用于我)。但是我问这个问题是希望找到更好的选择。我在这里做什么错了?
答案 0 :(得分:2)
模糊查询是术语级查询。这意味着在匹配文档之前不会对搜索到的文本进行分析。在您的情况下,在字段名称上使用标准分析器,该分析器将“ 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"
}
}
}
}
EDIT1:
{
"query": {
"match" : {
"item" : {
"query" : "Pineapple pizza",
"operator": "and",
"fuzziness": "auto"
}
}
}
}
“ operator”:“ and”->查询中的所有令牌必须存在于文档中。 如果存在任何一个令牌,则默认值为OR。还有其他可能的组合,您可以在其中定义百分比词中应匹配的令牌数量