1

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

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

如何使用查询 DSL 来实现这一点?

4

1 回答 1

5

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

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

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

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

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

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

于 2012-09-22T10:56:57.593 回答