Elasticsearch 多字段短语前缀查询

问题描述 投票:0回答:2

我是 ES 新手,我正在尝试构建一个对多个字段使用phrase_prefix 的查询,这样我就不必搜索多次。

这是我到目前为止所得到的:

{ 
    "query" : { 
        "text" : { 
            "first_name" : { 
                "query" : "Gustavo", 
                "type" : "phrase_prefix" 
            }
        } 
    }
}'

有人知道如何搜索多个字段,例如“last_name”吗?

elasticsearch match field
2个回答
52
投票

您正在使用的文本查询不久前已被弃用(实际上已重命名),取而代之的是匹配查询。匹配查询支持单个字段,但您可以使用multi_match query,它支持完全相同的选项并允许在多个字段上搜索。这是一个应该对您有帮助的示例:

{
    "query" : {
        "multi_match" : {
            "fields" : ["title", "subtitle"],
            "query" : "trying out ela",
            "type" : "phrase_prefix"
        }
    }
}

您可以使用 Java API 实现相同的目的,如下所示:

QueryBuilders.multiMatchQuery("trying out ela", "title", "subtitle")
    .type(MatchQueryBuilder.Type.PHRASE_PREFIX);

0
投票

如果您发现

phrase_prefix
搜索缺少某些结果,这是因为
max_expansions
限制。

虽然易于设置,但使用 match_phrase_prefix 查询进行搜索 自动完成有时会产生令人困惑的结果。

例如,考虑查询字符串 Quick Brown f。这个查询有效 通过使用 Quick 和 Brown 创建短语查询(即术语 Quick 必须存在并且后面必须跟术语“棕色”)。然后它看着 排序后的术语词典,查找以以下开头的前 50 个术语 f,并将这些术语添加到短语查询中。

问题是前 50 个术语可能不包含术语“fox”,所以 不会找到短语“Quick Brown Fox”。这通常不是 问题是用户将继续输入更多字母,直到单词 他们正在寻找出现。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase-prefix.html#match-phrase-prefix-autocomplete


作为解决方法,您可以在布尔查询下使用多个前缀。

GET items/_search
{"query":{"bool":{"should":[
  {"prefix":{"name_en":{"value":"musab","case_insensitive":true}}},
  {"prefix":{"name_tr":{"value":"musab","case_insensitive":true}}},
  {"prefix":{"name_de":{"value":"musab","case_insensitive":true}}}
]}}}
© www.soinside.com 2019 - 2024. All rights reserved.