我可以在一些字段中搜索,但是使用另一个字段的匹配分数进行排序吗?

时间:2015-05-26 11:47:36

标签: elasticsearch

我有一些像这样的文件

{"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部分可能会更复杂,整个查询似乎太长而无法编写。我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:0)

如果您希望只有与您的用户城市匹配的结果,则应将您的查询包装到必须查询中,例如:

{
  "query": {
    "bool": {
      "must": [{
        "bool": {
          "should": [{
            SHOULD_CLAUSE_1
          }, {
            SHOULD_CLAUSE_2
          }]
        }
      }, {
        "match": {
          "city": "Tokyo"
        }
      }]
    }
  }
}