2014-03-04 61 views
5

假设我有一个查询象下面这样:Elasticsearch复杂邻近查询

council* W/5 (tip OR tips)

上面的查询可以翻译为:找到任何有议会*(提示或提示)没有相隔超过5个字。

那么下面的文字将匹配:

  • 蚬壳市会提示
  • 议会最好
  • 议会前10 提示

但是这一次不应该匹配:

  • ...市议会在冲浪。根本没有任何好的小费

我需要帮助建立一个elasticsearch查询。我正在考虑正则表达式查询,但我不太确定更好的选择。谢谢

回答

6

您可以结合使用span_near查询,span_multispan_or。我们可以使用下面的查询来执行相同的搜索。

{ 
    "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 
    } 
    } 
} 

重要的事情看出来的是span_term这是你的文字进行搜索。在这个例子中,我只有一个名为“text”的字段。 Slop表示我们在这两个词之间允许的词数,in_order表示词的顺序很重要。所以“提示理事会”将不会匹配,“理事会提示”会在那里。

+0

感谢队友,那正是我要找的。我的查询非常复杂,我必须实施一些操作来使用这些span_ * elasticsearch查询来翻译这些查询。 –