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

Dai*_*ail 3 elasticsearch

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

例子:

"hell* worl*"~3
Run Code Online (Sandbox Code Playgroud)

基本上,我想得到所有以“hell”和“worl”开头的单词,它们彼此靠近,最大距离为 3。

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

DOC 说:

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

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

"hello world"~3 # this works
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

{  
   "size":15,
   "from":0,
   "query":{  
      "bool":{  
         "must":[  
            {  
               "query_string":{  
                  "query":"\"hell* worl*\"~3",
                  "analyze_wildcard":true
               }
            }
         ]
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

参考:

sla*_*wek 5

您可以使用跨度查询来实现您想要的,但要小心,因为这里没有分析这些术语。

{
  "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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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