我有一些像这样的文件
{"id":1,"city":"London","content":"soccer","continent":"Europe"},
{"id":2,"city":"New York","content":"basketball","continent":"North America"},
{"id":3,"city":"Tokyo","content":"baseball","continent":"Asia"},
...
我需要在某些字段(不包括city
字段)中搜索关键字,例如像
{
"query": {
"bool": {
"should": [ //SHOULD_CLAUSE
"match": {
"continent": "America"
},
"term": {
"content": "soccer"
}
]
}
}
}
为了使结果更具个性化",我想制作匹配的文档,其city
字段与访问用户的city
属性相同。
但是,如果我在city
布尔子句中将"match":{"city":"Tokyo"}
作为查询字段(类似should
),则可能会返回一些仅与city
字段匹配的文档,这些字段不匹配我需要搜索的字段。使用boost
使city
字段更多"重要"排序的事情变得更糟。
我怎样才能实现目标?
似乎可以通过两种方式编写SHOULD_CLAUSE
部分并使用city
and
子句结合使用
{
"query": {
"bool": {
"should": [{
"bool": {
"must": [{
"bool": {
SHOULD_CLAUSE
}
}, {
"match": {
"city": {
"query": "Tokyo",
"boost": 4.0
}
}
}]
}
}, {
"bool": {
SHOULD_CLAUSE
}
}]
}
}
}
但在真实情况下,SHOULD_CLAUSE
部分可能会更复杂,整个查询似乎太长而无法编写。我想知道是否有更好的方法。
答案 0 :(得分:0)
如果您希望只有与您的用户城市匹配的结果,则应将您的查询包装到必须查询中,例如:
{
"query": {
"bool": {
"must": [{
"bool": {
"should": [{
SHOULD_CLAUSE_1
}, {
SHOULD_CLAUSE_2
}]
}
}, {
"match": {
"city": "Tokyo"
}
}]
}
}
}