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

use*_*318 6 spaces wildcard elasticsearch

我有以下查询.我正试图找到'hello world'的值,但它返回零结果.但是,什么时候value = 'hello*',它确实给了我预期的结果.知道我怎么可以改变我的查询给我那个hello world结果吗?我试过了*hello world*,但由于某种原因它只是不会用空格搜索任何东西.

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

 {
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "terms": {
              "variant": [
                "collection"
              ]
            }
          }
        ]
      },
      "query": {
        "wildcard": {
          "name": {
            "value": "hello world"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

max*_*max 9

你需要使用

match_phrase: {"field_name": "some phrase with spaces"}
Run Code Online (Sandbox Code Playgroud)

正如官方文档中提到的,

要执行短语搜索而不是匹配单个术语,请使用 match_phrase 而不是 match

  • 该答案为 0 分,是我找到的唯一有效答案。当您不允许更改映射时,它也可以解决问题。 (3认同)
  • 这是正确的答案。 (3认同)
  • 这几乎解决了我的所有问题 (2认同)
  • 这是正确的答案。 (2认同)

小智 6

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

您必须更改映射以使字段"name"为not_analyzed,然后使用带空格的通配符搜索将起作用.

需要注意的是:通配符搜索很重要.如果要进行部分匹配搜索(相当于%like%)您可以在分析器中使用ngram标记过滤器并进行术语搜索.它将负责匹配部分字符串并具有更好的性能.


小智 5

“字符串”类型是遗留的,并且索引为“not_analyzed”,它被映射到未分为子字符串的类型“关键字”。我之前遇到过包含空格的查询问题,并通过在空格处的子字符串中拆分查询并进行组合查询来解决它,使用“bool”和“must”为每个子字符串添加一个通配符对象:

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "name": "*hello*"
          }
        },
        {
          "wildcard": {
            "name": "*world*"
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这个方法有个小缺点,就是“地狱世界!” 和其他意外的字符串最终会出现在您的结果中。您可以通过将除最后一个子字符串之外的所有内容的“通配符”更改为“匹配”来解决该问题。

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

PUT your_index
{
  "mappings": {
    "your_index": {
      "properties": {
        "your_field1": {
           "type": "keyword"
            },
        "your_field2": {
            "type": "string",
            "index": "not_analyzed"
            }
         }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)