我的ES中有以下文件
name type
Thomas Robert King xyz
Peter Jacob Junior xyz
Robert Einstein Jr abc
Thomas Jupyin DR xyz
我希望得到所有与Robert和Thomas匹配的文档,并且都是xyz类型。
我创建的当前ES查询是:
http://localhost/index/type/_search/?size=100&pretty=1/
{
"query": {
"bool": {
"must": [
{
"match":
{ "name": "Thomas" }
},
{
"match":
{ "name": "Robert" }
}
],
"must_not": [
{
{
"match":
{ "type": "abc" }
}
]
}
}
}
这是在弹性搜索中创建AND场景的正确方法,还是有更好的查询来处理相同的输出。 我正在使用ES 2.1 感谢
答案 0 :(得分:0)
鉴于您当前的目标:在句子中获取与Robert和Thomas匹配的所有文档,并且类型为xyz,您不应该在abc上使用must_not查询。如果有其他类型(例如ubv),您的查询也将获得与此类型匹配的文档。
您可以执行该查询:
{
"query": {
"bool": {
"must": [
{
"match":
{
"name": {
"query": "Thomas Robert",
"operator": "and"
}
}
},
{
"match":
{
"type": "xyz"
}
}
]
}
}
}
顺便说一句,这些子句必须在bool查询中对查询进行评分。如果您只想过滤类型xyz,您应该使用:
{
"query": {
"bool": {
"must": [
{
"match":
{
"name": {
"query": "Thomas Robert",
"operator": "and"
}
}
}],
"filter": [
{
"match":
{
"type": "xyz"
}
}
]
}
}
}
此外,请查看术语级别查询与全文查询,以查看您真正需要的内容。如果您的"键入"如果不分析字段,则应使用术语查询而不是匹配来避免在匹配查询中进行分析。
https://www.elastic.co/guide/en/elasticsearch/reference/2.3/term-level-queries.html