我有一个简单的文档,其中包含一个名为“关键字”的字段,该字段被索引用于文本搜索。关键字是单词和短短语的数组,如下所示:
{“关键字”:[“餐厅经理”,“厨师”,“公共汽车男孩”]}
查询必须包含文档关键字中至少一项的所有单词,以便返回该文档。
例子:
“经理”不应返回此文档。
“ bus”和“ manager”不应返回此文档。
“餐厅经理”应返回此文档。
“ chef”应返回此文档。
“餐厅经理厨师”应返回此文档,并获得更高的分数。
“餐厅经理无关字词”应返回此文档。
“餐厅经理巴士”应返回此文档,但理想情况下,其得分不应高于“餐厅经理”。
评分很重要,因此我需要使其成为查询而不是过滤器。
我正在使用Elasticsearch 1.7。
这可以通过以下设置来实现。
POST your_index { "settings": { "analysis": { "analyzer": { "keyword_analyzer": { "type": "custom", "filter": [ "lowercase" ], "tokenizer": "keyword" }, "shingle_analyzer":{ "type" : "custom", "filter" :["lowercase","shingle_filter"], "tokenizer" : "standard" } }, "filter": { "shingle_filter": { "type": "shingle", "min_shingle_size": 2, "max_shingle_size": 5 } } } }, "mappings": { "your_type": { "properties": { "keywords": { "type": "string", "index_analyzer": "keyword_analyzer", "search_analyzer": "shingle_analyzer" } } } } }
在这里,由于需求analyzers,我使用了两种不同的方法,一种用于indexing和一种用于searching。keyword_analyzer需要按原样索引该词,以便对 经理的 查询不会与 饭店经理 一起返回文档。有关关键字分析器的更多信息。现在,搜索需要带状滤波器以phrases从输入文本生成。像 This restaurant manager那样的 文本将被分成 This restaurant , restaurant manager , manager is 等等,您将获得期望的结果。您可以使用分析API来查看分析器的工作方式。
analyzers
indexing
searching
keyword_analyzer
phrases
您可以像这样索引文档
PUT your_index/your_type/1 { "keywords": ["restaurant manager", "chef", "bus boy"] }
这种类型的查询将为您提供文件
GET your_index/_search { "query": { "match": { "keywords": "This restaurant manager is also a good chef" } } }
希望这可以帮助!