Elasticsearch完成 - 使用分析器生成输入列表

Lew*_*ond 9 autocomplete elasticsearch

我看过这篇文章:https://www.elastic.co/blog/you-complete-me 但是,它需要在客户端编写一些逻辑来创建多个"输入".有没有办法定义一个分析器(可能使用shingle或ngram/edge-ngram)来生成多个输入项?

这是我尝试过的(显然不起作用):

DELETE /products/
PUT /products/
{
    "settings": {
        "analysis": {
            "filter": {
                "autocomplete_filter": {
                    "type":"shingle",
                    "max_shingle_size":5,
                    "min_shingle_size":2
                }
            },
            "analyzer": {
                "autocomplete": {
                    "filter": [
                        "lowercase",
                        "autocomplete_filter"
                    ],
                    "tokenizer": "standard"
                }
            }
        }
    }, 
    "mappings": {
        "product": {
            "properties": {
                "name": {"type": "string"
                ,"copy_to": ["name_suggest"]
                }
                ,"name_suggest": {
                    "type": "completion",
                    "payloads": false,
                    "analyzer": "autocomplete"
                }
            }
        }
    }
}

PUT /products/product/1
{
    "name": "Apple iPhone 5"
}

PUT /products/product/2
{
    "name": "iPhone 4 16GB"
}

PUT /products/product/3
{
    "name": "iPhone 3 GS 16GB black"
}

PUT /products/product/4
{
    "name": "Apple iPhone 4 S 16 GB white"
}

PUT /products/product/5
{
    "name": "Apple iPhone case"
}

POST /products/_suggest
{
    "suggestions": {
        "text":"i"
        ,"completion":{
            "field": "name_suggest"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Arc*_*ena 4

不要认为有直接的方法可以实现这一目标。我不确定为什么需要存储 ngrammed 标记,考虑到 elasticsearch 已经将“输入”文本存储为 FST 结构。新版本还允许建议查询中的模糊性。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html#fuzzy

我可以理解需要像木瓦分析器这样的东西来为您生成输入,但似乎还没有办法。话虽如此,_analyze端点可用于从您选择的分析器生成令牌,并且这些令牌可以传递到“输入”字段(有或没有任何其他添加的逻辑)。这样您就不必在应用程序代码中复制分析器逻辑。这是我能想到的实现所需输入字段的唯一方法。

希望能帮助到你。