弹性搜索带空格的通配符搜索

时间:2015-05-08 00:16:19

标签: elasticsearch wildcard spaces

我有以下查询。我试图找到' hello world'的值,但它返回零结果。但是,当value = 'hello*'时,它确实给了我预期的结果。知道我怎么可以改变我的查询给我那个hello world结果吗?我已经尝试了*hello world*,但出于某种原因,它只是不会用空格搜索任何内容。

我认为它与空格有关,因为当我尝试搜索"* *"时,它没有给我任何结果。但我知道我有许多空间值。任何想法都会有所帮助!

 {
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "terms": {
              "variant": [
                "collection"
              ]
            }
          }
        ]
      },
      "query": {
        "wildcard": {
          "name": {
            "value": "hello world"
          }
        }
      }
    }
  }
}

3 个答案:

答案 0 :(得分:6)

您用于字段name的映射是什么?如果您尚未定义任何映射,或者您刚刚将类型定义为字符串(没有任何分析器),则将使用标准分析器分析该字段。这将分别创建标记为“hello”和“world”。这意味着通配符查询适用于*ell**wor*,但不适用于空格。

您必须更改映射以使字段“name”为not_analyzed,然后使用带空格的通配符搜索。

谨慎提醒: 通配符搜索很重。如果要进行部分匹配搜索(相当于%like%)您可以在分析器中使用ngram标记过滤器并进行术语搜索。它将处理匹配的部分字符串并具有更好的性能。

答案 1 :(得分:3)

The "string" type is legacy and with index "not_analyzed" it is mapped to the type "keyword" which is not divided into substrings.我之前遇到包含空格的查询问题,并通过在空格中的子串中拆分查询并进行组合查询来解决它,为每个子字符串添加一个通配符对象,使用"布尔"和"必须":

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "name": "*hello*"
          }
        },
        {
          "wildcard": {
            "name": "*world*"
          }
        }
      ]
    }
  }
}

这种方法有一个小缺点,即地狱世界!"和其他意外的字符串最终会出现在你的结果中您可以通过更改"通配符"来解决这个问题。到"匹配"除了最后一个子串之外的所有子串。

您应该首先尝试更改字段的类型来解决它:

PUT your_index
{
  "mappings": {
    "your_index": {
      "properties": {
        "your_field1": {
           "type": "keyword"
            },
        "your_field2": {
            "type": "string",
            "index": "not_analyzed"
            }
         }
      }
    }
  }
}

答案 2 :(得分:0)

您需要使用 match_phrase:{“ field_name”:“一些带空格的短语”}