![](/img/trans.png)
[英]search for multiple values, sort by relevance (php + MySQL, no full text search)
[英]PHP Elastic Search Full Text Search - Sort by Relevance
我想使用Elastic Search中的“%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"
}
}
}
实现您想要的一种方法是指定一个在搜索时使用的分析器(即standard
),这样默认ngram分析器就不会对您的输入进行分析。 这样,你就只匹配ab
令牌既不a
也不b
令牌。
GET user/_search
{
"query": {
"query_string": {
"fields": ["firstname^2", "lastname"],
"query": "ab",
"analyzer": "standard" <--- add this
}
}
}
但是,一种更好的方法是在映射中设置"search_analyzer": "standard"
而不是在搜索时也使用ngram方法,仅在指定"analyzer": "substring_analyzer"
时就是这种情况。 因此,如果您搜索ab
,则只会匹配ab
令牌,因为在搜索时不会进行ngram标记。
"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
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.