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

sam*_*sam 1 database elasticsearch

我有一个非常基本的"用户"索引,单个类型的"用户"有几个字段.除此之外,我在索引上没有任何定义.

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

如何通过查询DSL实现这一目标?

jav*_*nna 5

有不同的方法来实现你想要的.我会说这取决于你想要进行前缀匹配的方式.您可以使用前缀查询或从用户字段中删除EdgeNGrams并在其上进行搜索,而无需前缀查询.第一个选项稍微慢一些,而第二个选项导致索引大小增加,因为你要索引更多的术语(ngrams).

如果您决定使用前缀查询,则需要将不同的查询组合在一起.你可以使用bool查询来做到这一点.您只需要确定哪些查询必须匹配,哪些查询必须匹配以及哪些查询应匹配(如果它们是可选的).您还可以对每个查询进行提升,以表示前缀匹配更重要,例如.

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

{
    "query" : {
        "query_string" : {
            "fields" : "user.ngrams^3 field1^2 field2",
            "query" : "query"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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