![](/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.