一尘不染

除了通用查询字符串外,如何在ElasticSearch中进行前缀搜索?

elasticsearch

我有一个非常基本的“用户”索引,其中一个类型为“用户”,其中有多个字段。除此之外,我在索引上没有任何定义。

我需要做的是提供自动完成的结果,该结果优先考虑前缀匹配(用于用户名),但还包含来自用户bio和网站的其他匹配以及其他字段的子字符串匹配。

如何使用查询DSL完成此操作?


阅读 271

收藏
2020-06-22

共1个答案

一尘不染

有多种方法可以实现您想要的。我会说这取决于您要进行前缀匹配的方式。您可以使用“
前缀查询”,也可以将EdgeNGrams放在用户字段之外并在其上进行搜索,而无需前缀查询。第一个选项要慢一些,而第二个选项会导致索引大小增加,因为您要为更多的词(ngram)建立索引。

如果决定前缀查询,则需要将不同的查询组合在一起。您可以使用bool查询来实现。您只需要确定哪些查询必须匹配,哪些查询不匹配以及哪些查询应匹配(如果它们是可选的)。您还可以提高每个查询的效率,例如表示前缀匹配更重要。

另一方面,如果您决定为EdgeNGrams编制索引,则可以使用单个查询字符串并搜索赋予它们不同权重的不同字段,如下所示:

{
    "query" : {
        "query_string" : {
            "fields" : "user.ngrams^3 field1^2 field2",
            "query" : "query"
        }
    }
}

您还需要考虑到查询字符串允许您搜索多个术语(从中生成布尔查询)并使用lucene查询语法。此外,查询字符串将被分析,而前缀查询则不会。这完全取决于您的需求以及这些功能是否对您的用例有用。

如果您需要更多信息,请与我们联系。

2020-06-22