elasticsearch - 同时使用 match_phrase_prefix 和模糊性的 Elasticsearch 查询?

标签 elasticsearch autocomplete fuzzy-search match-phrase

我是 Elasticsearch 的新手,所以我在为我们的数据找到最佳查询方面遇到了一些困难。

假设我想匹配以下单词“Handelsstandens Boldklub”。

目前,我正在使用以下查询:

{
    query: {
      bool: {
        should: [
          {
            match: {
              name: {
                query: query, slop: 5, type: "phrase_prefix"
              }
            }
          },
          {
            match: {
              name: {
                query: query,
                fuzziness: "AUTO",
                operator: "and"
              }
            }
          }
        ]
      }
    }
  }

如果我搜索“Hand”,它目前会列出该词,但如果我搜索“Handle”,该词将不再列出,因为我打错了字。但是,如果我以“Handlessstandens”到达结尾,它将再次列出,因为模糊会捕捉到拼写错误,但只有在我输入整个单词时才会出现。

是否有可能同时进行 phrase_prefix 和 fuzziness?那么在上面的例子中,如果我在途中打错了,它仍然会列出这个词?

所以在这种情况下,如果我搜索“Handle”,它仍然会匹配“Handelsstandens Boldklub”这个词。

或者还有什么其他的workaround可以实现上面的体验?我喜欢 phrase_prefix 匹配,因为它也支持草率匹配(因此我可以搜索“Boldklub han”,它会列出结果)

或者可以通过使用完成建议器来实现上述目标吗?

最佳答案

好的,所以在进一步调查 elasticsearch 之后,我得出的结论是我应该使用 ngrams。

这里很好地解释了它的作用和工作原理。 https://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch

这是我使用的设置和映射:(这是 elasticsearch-rails 语法)

settings analysis: {
  filter: {
    ngram_filter: {
      type: "ngram",
      min_gram: "2",
      max_gram: "20"
    }
  },
  analyzer: {
    ngram_analyzer: {
      type: "custom",
      tokenizer: "standard",
      filter: ["lowercase", "ngram_filter"]
    }
  }
} do
  mappings do
    indexes :name, type: "string", analyzer: "ngram_analyzer"
    indexes :country_id, type: "integer"
  end
end

和查询:(这个查询实际上同时在两个不同的索引中搜索)

{
    query: {
      bool: {
        should: [
          {
            bool: {
              must: [
                { match: { "club.country_id": country.id } },
                { match: { name: query } }
              ]
            }
          },
          {
            bool: {
              must: [
                { match: { country_id: country.id } },
                { match: { name: query } }
              ]
            }
          }
        ],
        minimum_should_match: 1
      }
    }
  }

但基本上您应该只进行匹配或多重匹配查询,具体取决于您要搜索的字段数。

我希望有人发现它有帮助,因为我个人在模糊而不是 ngram 方面考虑了很多(以前不知道)。这使我走错了方向。

关于elasticsearch - 同时使用 match_phrase_prefix 和模糊性的 Elasticsearch 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39119209/

相关文章:

mongodb - 如何使用 pymongo 创建索引

string-matching - 产品名称的模糊匹配

elasticsearch - 插入一个带有 _parent 字段的元素

elasticsearch - Elasticsearch:要备份哪些索引?

scala - 使用 Elastic4s 的动态 ElasticSearch 映射

autocomplete - 在不导入的情况下在 VSCode 中获取 Javascript 类型提示,这会导致循环依赖

Java RestHighLevelClient 与 AWS ElasticSearch

php - jQuery 和 PHP 建议答案

c - GNU 自动补全变量

regex - 模糊正则表达式