【问题标题】:Fuzzy search in ElasticSearch doesn't work with spacesElasticSearch 中的模糊搜索不适用于空格
【发布时间】:2020-02-22 18:25:03
【问题描述】:

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

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

"Pizza"
"Pineapple Pizza"

然后我使用这个查询搜索 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”(这个解决方案对我有用)。但我问这个问题是希望找到一个更好的选择。我在这里做错了什么?

【问题讨论】:

  • name 字段使用的分析器是什么?

标签: javascript node.js elasticsearch search fuzzy-search


【解决方案1】:

模糊查询是术语级别的查询。这意味着在匹配文档之前不分析搜索到的文本。在您的情况下,标准分析器用于字段名称,它将“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" --> 查询中的所有标记都必须存在于文档中。 默认为 OR ,如果存在任何一个标记,则存在文档。还有其他可能的组合,您可以在其中定义应以百分比形式匹配的令牌数

【讨论】:

  • 感谢您的回复。这种解决了我的问题。但是在搜索菠萝披萨时,我也会得到披萨。如果我只想要菠萝披萨怎么办?
  • 我尝试添加第三个披萨意大利辣香肠披萨。搜索菠萝披萨时,我还得到了意大利辣香肠披萨:(
  • 在匹配查询中使用运算符和。这意味着两个令牌都是必需的,默认是 or。您是否在关键字上使用了匹配模糊?
  • 我使用的是匹配查询而不是带有关键字的查询。我将尝试使用 and 运算符
  • 很高兴能帮上忙,我有一些使用它的经验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2021-03-27
  • 2020-06-18
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多