我想在搜索中匹配“new york”(不是分别包含“new”或“york”的地方)
这是我当前的查询:
"query" : {
"query_string" : {
"query" : "new york" ,
"fields" : ["city"]
}
},
"filter" : {
"and" : [{
"query" : {
"query_string" : {
"query" : "country:US"
}
}
}]
}
然而,这会让名为“york”的地方不再是“纽约”
我并不完全明白这是如何运作的,并希望能帮助我实现这一目标。
答案 0 :(得分:3)
如果您希望两个单词出现在同一个文档中,则需要更改默认运算符,如下所示:
"query" : {
"query_string" : {
"query" : "new york" ,
"fields" : ["city"],
"default_operator" : "AND"
}
}
或在查询中指定:
"query" : {
"query_string" : {
"query" : "new AND york" ,
"fields" : ["city"]
}
}
查看query string文档。
否则,如果您希望两个单词在同一文档中彼此靠近显示,则需要制作phrase query,如下所示:
"query" : {
"match_phrase" : {
"message" : "new york"
}
}
答案 1 :(得分:0)
默认情况下,城市字段在"分析"由Elasticsearch执行单词的默认标记化。
New York => *New*, *York*
为了保持令牌完整(主要用于聚合),您需要明确地制作城市字段"未分析"使用多字段
'city' => [
'type' => 'string',
'fields' => [
'raw' => [
'type' => 'string',
'index' => 'not_analyzed'
]
]
]
现在,您可以使用city.raw
来获取未分析的值。