我想使用弹性搜索中的“%LIKE%”条件获取“用户”数据。
GET user/_search
{
"query": {
"query_string": {
"fields": ["firstname", "lastname"],
"query": "*a*"
}
},
"sort": {
"_score": "desc"
}
}
它以“_score”返回结果:1表示所有数据。
名为“Kunal Dethe”的数据是第一个,“Abhijit Pingale”是第二个。
但正如预期的那样,“Abhijit Pingale”应该首先出现,因为字母“a”在此名称中出现两次,而不是在“Kunal Dethe”中出现。
任何想法为什么?
修改: 使用“nGram”解决方案但是对于像“ab”这样的文本,克被分解为“a”,“b”然后是“ab”,因为“min_gram”被设置为1,因为即使在输入单个字符。
但我希望搜索只能以“ab”完成。
当然,可以增加“min_gram”但可以动态设置为搜索文本的长度吗?
POST /user
{
"settings": {
"analysis": {
"filter": {
"substring": {
"type": "nGram",
"min_gram": 1,
"max_gram": 15
}
},
"analyzer": {
"substring_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"substring"
]
}
}
}
},
"mappings": {
"user": {
"properties": {
"id": {
"type": "long"
},
"firstname": {
"type": "string",
"analyzer": "substring_analyzer"
},
"lastname": {
"type": "string",
"analyzer": "substring_analyzer"
}
}
}
}
}
//Searching via
GET user/_search
{
"query": {
"query_string": {
"fields": ["firstname^2", "lastname"],
"query": "ab"
}
}
}
答案 0 :(得分:2)
实现目标的一种方法是在搜索时指定要使用的分析器(即ab
),这样您的输入就不会被默认的ngram分析器分析。这样,您只会匹配a
令牌,而不会匹配b
或GET user/_search
{
"query": {
"query_string": {
"fields": ["firstname^2", "lastname"],
"query": "ab",
"analyzer": "standard" <--- add this
}
}
}
令牌。
"search_analyzer": "standard"
然而,更好的方法是在映射中设置"analyzer": "substring_analyzer"
,而不是在搜索时使用ngram方法,这只是在指定ab
时的情况。因此,如果您搜索ab
,那么您只会匹配"mappings": {
"user": {
"properties": {
"id": {
"type": "long"
},
"firstname": {
"type": "string",
"analyzer": "substring_analyzer",
"search_analyzer": "standard" <-- add this
},
"lastname": {
"type": "string",
"analyzer": "substring_analyzer",
"search_analyzer": "standard" <-- add this
}
}
}
}
令牌,因为在搜索时这不会是ngram&#39}。
malloc()