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

时间:2012-09-21 22:22:56

标签: database elasticsearch

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

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

如何使用查询DSL实现此目的?

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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