我想在Elastic Search中使用「%LIKE%」條件獲取「用戶」數據。PHP彈性搜索全文搜索 - 排序方式相關度
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"
}
}
}
當您使用通配符時,計分沒有意義。這就是爲什麼它這樣做。另外,使用前綴通配符會引起麻煩,因爲它必須逐字檢查倒排索引中的每一項。 – pickypg
但我確實需要「\ * a \ *」之類的查詢來完成。有沒有其他方法可以實現這一點? –
如果你想避免通配符,你需要一個涉及ngrams的解決方案。看到這個:http://stackoverflow.com/questions/34331249/elasticsearch-query-string-dont-search-by-word-part/34331544#34331544 – Val