我剛剛開始使用ElasticSearch並嘗試基於它實現自動完成功能。使用ElasticSearch模擬SQL LIKE搜索
我有一個autocomplete
索引,其中字段city
的類型爲string
。下面是存儲到該索引文件的例子:
{
"_index":"autocomplete_1435797593949",
"_type":"listing",
"_id":"40716",
"_source":{
"city":"Rome",
"tags":[
"listings"
]
}
}
該分析的配置是這樣的:
{
"analyzer":{
"autocomplete_term":{
"tokenizer":"autocomplete_edge",
"filter":[
"lowercase"
]
},
"autocomplete_search":{
"tokenizer":"keyword",
"filter":[
"lowercase"
]
}
},
"tokenizer":{
"autocomplete_edge":{
"type":"nGram",
"min_gram":1,
"max_gram":100
}
}
}
的映射:
{
"autocomplete_1435795884170":{
"mappings":{
"listing":{
"properties":{
"city":{
"type":"string",
"analyzer":"autocomplete_term"
},
}
}
}
}
}
我送下面的查詢ES:
{
"query":{
"multi_match":{
"query":"Rio",
"analyzer":"autocomplete_search",
"fields":[
"city"
]
}
}
}
因此,我得到以下內容:
{
"took":2,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"failed":0
},
"hits":{
"total":1,
"max_score":2.7742395,
"hits":[
{
"_index":"autocomplete_1435795884170",
"_type":"listing",
"_id":"53581",
"_score":2.7742395,
"_source":{
"city":"Rio",
"tags":[
"listings"
]
}
}
]
}
}
大多數情況下,它都可以工作。在用戶必須實際鍵入整個單詞("Ri"
就足夠了)之前,它確實找到了帶有city = "Rio"
的文檔。
這裏是我的問題。我希望它也能返回"Rio de Janeiro"
。爲了得到"Rio de Janeiro"
,我需要發送以下查詢:
{
"query":{
"multi_match":{
"query":"Rio d",
"analyzer":"standard",
"fields":[
"city"
]
}
}
}
注意的"<whitespace>d"
那裏。
另外一個相關的問題是,我期望與"R"
至少啓動所有城市都用下面的查詢返回:
{
"query":{
"multi_match":{
"query":"R",
"analyzer":"standard",
"fields":[
"city"
]
}
}
}
我期望"Rome"
,等...(這是一個存在於索引中的文檔),但是,我只能得到"Rio"
。我希望它的行爲像SQL LIKE
條件,即... LIKE 'CityName%'
。
我在做什麼錯?
謝謝!這工作很好:) – FullOfCaffeine