Elasticsearch complex proximity query

时光怂恿深爱的人放手 提交于 2020-01-01 10:50:56

问题


Given that I have a query like below:

council* W/5 (tip OR tips)

The above query can be translated as: Find anything that has council* and (tip OR tips) no more than 5 words apart.

So following text will match:

  • Shellharbour City Council Tip
  • council best tip
  • councils top 10 tips

But this one should not match:

  • ... City Council at Shellharbour. There is not any good tip at all.

I need help to build an elasticsearch query for that. I was thinking about Regex query but I'm not quite sure about better alternatives. Thanks


回答1:


You can use a combination of the span_near query, span_multi and span_or. We can use the query below to perform the same search.

{
  "query": {
    "span_near": {
      "clauses": [
        {
          "span_multi":
          {
            "match":
            {
              "prefix": { "text": "council"}
            }
          }
        },
        {
          "span_or": {
            "clauses": [
              {
                "span_term": {
                  "text": {
                    "value": "tip"
                  }
                }
              },
              {
                "span_term": {
                  "text": {
                    "value": "tips"
                  }
                }
              }
            ]
          }
        }
      ],
      "slop": 5,
      "in_order": true
    }
  }
}

The important things to look out for are the span_term which is the text your searching for. In this example I only had one field called "text". Slop indicates the number of words we will allow between the terms, and in_order indicates that the order of words is important. So "tip council" will not match, where as "council tip" will.



来源:https://stackoverflow.com/questions/22162248/elasticsearch-complex-proximity-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!