我是 ES 新手,我正在尝试构建一个对多个字段使用phrase_prefix 的查询,这样我就不必搜索多次。
这是我到目前为止所得到的:
{
"query" : {
"text" : {
"first_name" : {
"query" : "Gustavo",
"type" : "phrase_prefix"
}
}
}
}'
有人知道如何搜索多个字段,例如“last_name”吗?
您正在使用的文本查询不久前已被弃用(实际上已重命名),取而代之的是匹配查询。匹配查询支持单个字段,但您可以使用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);
如果您发现
phrase_prefix
搜索缺少某些结果,这是因为 max_expansions
限制。
虽然易于设置,但使用 match_phrase_prefix 查询进行搜索 自动完成有时会产生令人困惑的结果。
例如,考虑查询字符串 Quick Brown f。这个查询有效 通过使用 Quick 和 Brown 创建短语查询(即术语 Quick 必须存在并且后面必须跟术语“棕色”)。然后它看着 排序后的术语词典,查找以以下开头的前 50 个术语 f,并将这些术语添加到短语查询中。
问题是前 50 个术语可能不包含术语“fox”,所以 不会找到短语“Quick Brown Fox”。这通常不是 问题是用户将继续输入更多字母,直到单词 他们正在寻找出现。
作为解决方法,您可以在布尔查询下使用多个前缀。
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}}}
]}}}