Elasticsearch:在同一字段上精确匹配多个匹配短语

时间:2019-04-11 15:57:04

标签: elasticsearch elastic-stack elasticsearch-5 elasticsearch-plugin

我希望以下查询返回在特定字段中用OR分隔的确切短语匹配的结果。

{
  "query": {
    "nested": {
      "path": "positions",
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "default_field": "positions.companyname",
                "query": "microsoft OR gartner OR IBM"
              }
            },
            {
              "query_string": {
                "default_field": "positions.title",
                "query": "(Chief Information Security Officer) OR (Chief Digital Officer)"
              }
            }
          ]
        }
      },
      "inner_hits": {
        "highlight": {
          "fields": {
            "positions.title": {}
          }
        }
      }
    }
  }
}

结果应包含确切的首席信息安全官首席数字官

但不是 首席 数字营销主管 首席 < em>信息 Officer ,因为它目前正在返回。

此外,该字段不一定必须具有要搜索的确切短语。 例如:

“ CIO首席信息官”->错误

“数字技术负责人-首席数字官”->是

“前首席信息安全官”->是

“首席信息官”->错误

我想我要说的是这些短语应该总是彼此相邻(接近)。

2 个答案:

答案 0 :(得分:1)

对于您的用例,我建议您在match_phrase query应该子句中使用bool query's

类似的事情应该起作用:

GET stackoverflow/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "text": "Chief Information Security Officer"
          }
        },
        {
          "match_phrase": {
            "text": "Chief Digital Officer"
          }
        }
      ]
    }
  }
}

答案 1 :(得分:0)

此查询即可完成。

{
  "query": {
    "nested": {
      "path": "positions",
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "default_field": "positions.companyname",
                "query": "microsoft OR gartner OR IBM"
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match_phrase": {
                      "positions.title": "chief information security officer"
                    }
                  },
                  {
                    "match_phrase": {
                      "positions.title": "chief digital officer"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

match_phrase 确保要搜索的是确切的词组。要在同一字段上匹配多个词组,请使用 bool 运算符,且条件为应该