ElasticSearch 5.x向Suggestedter API(Documentation)引入了一些(突破性的)更改。最顯着的變化是:面向字的完成建議(ElasticSearch 5.x)
完成建議者是面向文檔的
建議都知道他們屬於 文件。現在,相關文檔(
_source
)是 作爲完成建議的一部分返回。
總之,一切完成查詢返回所有匹配文件,而不是隻匹配話。這裏存在的問題是如果自動完成的單詞出現在多個文檔中,則會出現重複。
比方說,我們有這個簡單的映射:
{
"my-index": {
"mappings": {
"users": {
"properties": {
"firstName": {
"type": "text"
},
"lastName": {
"type": "text"
},
"suggest": {
"type": "completion",
"analyzer": "simple"
}
}
}
}
}
}
少數測試文檔:
{
"_index": "my-index",
"_type": "users",
"_id": "1",
"_source": {
"firstName": "John",
"lastName": "Doe",
"suggest": [
{
"input": [
"John",
"Doe"
]
}
]
}
},
{
"_index": "my-index",
"_type": "users",
"_id": "2",
"_source": {
"firstName": "John",
"lastName": "Smith",
"suggest": [
{
"input": [
"John",
"Smith"
]
}
]
}
}
而且一個由這本書查詢:
POST /my-index/_suggest?pretty
{
"my-suggest" : {
"text" : "joh",
"completion" : {
"field" : "suggest"
}
}
}
這將產生結果如下:
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"my-suggest": [
{
"text": "joh",
"offset": 0,
"length": 3,
"options": [
{
"text": "John",
"_index": "my-index",
"_type": "users",
"_id": "1",
"_score": 1,
"_source": {
"firstName": "John",
"lastName": "Doe",
"suggest": [
{
"input": [
"John",
"Doe"
]
}
]
}
},
{
"text": "John",
"_index": "my-index",
"_type": "users",
"_id": "2",
"_score": 1,
"_source": {
"firstName": "John",
"lastName": "Smith",
"suggest": [
{
"input": [
"John",
"Smith"
]
}
]
}
}
]
}
]
}
總之,對於文本「joh」的完成建議,返回了兩個(2)文檔 - John和他們都具有相同的text
屬性值。
但是,我想收到一個(1)字。簡單的東西是這樣的:
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"my-suggest": [
{
"text": "joh",
"offset": 0,
"length": 3,
"options": [
"John"
]
}
]
}
問題:如何實現一個基於詞完成建議者。沒有必要返回任何文檔相關的數據,因爲我現在不需要它。
「完成建議」是否適合我的場景?還是應該使用完全不同的方法?
編輯: 正如你們許多人所指出的,額外的完成,只指數將是一個可行的解決方案。但是,我可以看到使用此方法的多個問題:
- 保持新索引同步。
- 自動填寫後續單詞可能是全球性的,而不是縮小範圍。例如,假設您在附加索引中有以下詞語:
"John", "Doe", "David", "Smith"
。查詢"John D"
時,不完整單詞的結果應爲"Doe"
而不是"Doe", "David"
。
爲了克服第二點,只索引單個單詞是不夠的,因爲您還需要將所有單詞映射到文檔以正確縮小自動完成後續單詞的範圍。與此一起,您實際上遇到與查詢原始索引相同的問題。因此,額外的索引不再有意義了。
爲[在這個問題]在暗示(https://github.com/elastic/elasticsearch/issues/21676),這種新的行爲是 「設計」並沒有計劃改變它。他們的建議是爲完成建議者創建另一個索引。正如下面的@EdgarVonk所建議的那樣。 – Val
關於當前索引的自定義查詢呢?也許用獨特的查詢(術語聚合)爲所有建議創建額外的NGram字段?至於額外的建議索引,我可以確定一些問題,這些問題實際上與您提出的解決方案相矛盾(請參閱我的更新問題)。 – alesc
當然,術語聚合也可以實現類似的目標,但它取決於您擁有的文檔的負載。我不是在提出這個解決方案,埃德加和ES人(見問題)是;-) – Val