允许在具有多个单词的邻近搜索中使用通配符

时间:2017-09-18 13:25:19

标签: elasticsearch

我在Ubuntu 16.04上使用ElasticSearch 5.6。我的问题是当我尝试在具有多个单词的邻近搜索中使用通配符时。

示例:

"hell* worl*"~3

基本上,我想得到所有以“地狱”和“世界”开头的单词,彼此接近,最大距离为3。

我没有收到任何错误,但找不到文件。似乎没有分析通配符。我也设置了analyze_wildcard: true

DOC说:

  

默认情况下,不分析查询字符串中的通配符。通过   将此值设置为true,将尽最大努力进行分析   那些。

但是,只有以下查询有效:

"hello world"~3 # this works

这是我的疑问:

{  
   "size":15,
   "from":0,
   "query":{  
      "bool":{  
         "must":[  
            {  
               "query_string":{  
                  "query":"\"hell* worl*\"~3",
                  "analyze_wildcard":true
               }
            }
         ]
      }
   }
}

参考:

1 个答案:

答案 0 :(得分:3)

您可以使用span queries来获得您想要的内容,但要小心,因为这里不会分析这些条款。

{
  "size": 15,
  "from": 0,
  "query": {
    "span_near": {
      "clauses": [
        {
          "span_multi": {
            "match": {
              "wildcard": {
                "t": "hell*"
              }
            }
          }
        },
        {
          "span_multi": {
            "match": {
              "wildcard": {
                "t": "worl*"
              }
            }
          }
        }
      ],
      "slop": 3,
      "in_order": true
    }
  }
}

query_string中的问题是*字符在引号内不被视为通配符。你得到的是类似于"hell# worl#"~3的简单slop短语,因为特殊字符在引号内没有意义。

但要小心,因为跨度查询的性能比简单的短语搜索慢得多(尽管它似乎仍然是faster而不是slop phrases,这实际上让我感到惊讶。)

如果您仍然可以为场景准备数据,那么更好的选择就是使用ngrams。使用ngrams简单"hell worl"~3可以匹配你想要的。