代码之家  ›  专栏  ›  技术社区  ›  Dail

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

  •  3
  • Dail  · 技术社区  · 9 年前

    示例:

    "hell* worl*"~3
    

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

    analyze_wildcard: true

    医生说:

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

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

    "hello world"~3 # this works
    

    这是我的问题:

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

    1 回复  |  直到 9 年前
        1
  •  5
  •   slawek    9 年前

    您可以使用 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 * 字符在引号内不被视为通配符。你得到的是简单的slop短语,类似于 "hell# worl#"~3 因为特殊字符在引号中没有意义。

    但是要小心,因为span查询的性能比简单短语搜索慢得多(尽管看起来仍然如此) faster slop phrases

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