我有以下查询。我试图找到' hello world'的值,但它返回零结果。但是,当value = 'hello*'
时,它确实给了我预期的结果。知道我怎么可以改变我的查询给我那个hello world结果吗?我已经尝试了*hello world*
,但出于某种原因,它只是不会用空格搜索任何内容。
我认为它与空格有关,因为当我尝试搜索"* *"
时,它没有给我任何结果。但我知道我有许多空间值。任何想法都会有所帮助!
{
"query": {
"filtered": {
"filter": {
"and": [
{
"terms": {
"variant": [
"collection"
]
}
}
]
},
"query": {
"wildcard": {
"name": {
"value": "hello world"
}
}
}
}
}
}
答案 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”:“一些带空格的短语”}