弹性搜索查询同时使用match_phrase_prefix和fuzziness?

时间:2016-08-24 09:18:18

标签: elasticsearch autocomplete fuzzy-search match-phrase

我是弹性搜索的新手,所以我正在努力寻找我们数据的最佳查询。

想象一下,我希望匹配以下单词" Handelsstandens Boldklub"。

目前,我使用以下查询:

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

如果我正在搜索" Hand"它目前列出了这个词,但如果我搜索" Handle"这个词将不再列出,因为我做了一个错字。但是,如果我通过" Handlesstandens"它会被再次列出,因为模糊性会记录错字,但只有当我输入整个单词时才会出现。

在某种程度上可以同时执行phrase_prefix和fuzziness吗?所以在上面的例子中,如果我在路上打错,它仍会列出单词?

所以在这种情况下,如果我搜索" Handle",它仍将匹配" Handelsstandens Boldklub"。

或者有什么其他解决方法可以实现上述体验?我喜欢phrase_prefix匹配,因为它也支持草率匹配(因此我可以搜索" Boldklub han"它会列出结果)

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

1 个答案:

答案 0 :(得分:2)

好的,所以在进一步调查弹性搜索之后,我得出的结论是我应该使用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
      }
    }
  }

但基本上你应该做一个匹配或多匹配查询,具体取决于你想要搜索的字段数。

我希望有人觉得它很有帮助,因为我个人在考虑模糊而不是ngrams(以前没有知道)。这导致我走错了方向。