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)
你需要使用
match_phrase: {"field_name": "some phrase with spaces"}
Run Code Online (Sandbox Code Playgroud)
正如官方文档中提到的,
要执行短语搜索而不是匹配单个术语,请使用 match_phrase 而不是 match
小智 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)
| 归档时间: |
|
| 查看次数: |
5932 次 |
| 最近记录: |