当前位置: 首页 > 面试题库 >

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

李昌勋
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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

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

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

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



 类似资料:
  • 尝试使用通配符进入和弹性搜索精确短语搜索时遇到问题query_string。 希望能够返回结果,这将是所有变体的精确短语。i、 e.“库尔斯酿酒厂”、“库尔斯酿酒厂”、“库尔斯酿酒厂”等。 我不同意这种方法,但想搜索大部分文档以找到匹配的1或2个字段。

  • 问题内容: 我很难用Elasticsearch构建查询。 我想查询类似的东西: 所以我试图构造的是这样的: 但这似乎返回一个错误。 谁能给我一个指针,我应该如何看待用Elasticsearch进行这种OR查询? 我当前的数据已发送: 和我的查询: 返回此错误: 问题答案: 这是由于JSON格式错误所致。此查询的正确JSON格式如下-

  • 问题内容: 我正在尝试将范围查询与elasticsearch一起使用 但是弹性返回没有结果。我发现系统存在字符串包含或问题 这是该字段的映射: 问题答案:

  • 问题内容: 这是文件列表: 现在,我想对它进行数字排序。以 23 开头,以 102 结尾。 我曾尝试和。对这些混乱的字符串没有帮助。 我可以忽略带选项的数字的前导字符串,还是必须精明和脚本化? 问题答案: 采用 从手册页:

  • 问题内容: 我有一个类似以下设置和映射的索引; 我正在努力实现现场通配符搜索的实现。我的示例数据如下: 当我执行以下查询时; 它返回,。我认为,它仍然标记数据。它只能返回。 您能帮上忙吗? 提前致谢 问题答案: 我的解决方案历险记 如您在我的问题中所见,我已经开始审理案件。每当我更改了一部分设置后,一部分便开始工作,而另一部分则停止工作。让我给出我的解决方案历史记录: 1.) 我已将数据索引为默认

  • 问题内容: 在Elasticsearch中,如何搜索任意子字符串,也许包括空格?(仅搜索单词的一部分是不够的;我想搜索整个字段的任何子字符串。) 我想它必须在一个字段中,而不是一个字段中。 假设我的Elasticsearch索引中只有几千个文档,然后尝试: 可以按预期工作,我得到了描述中“计划”所在的每个项目,甚至是“替代”项目。 现在,我想做 …以便在许多其他可能性中将文件与“ Kaplan不是