我有一个简单的文档,其中包含一个名为“keywords”的字段,该字段是为文本搜索编制索引的。关键字是一系列单词和短语,如下所示:
{“keywords”:[“restaurant manager”,“chef”,“bus boy”]}
查询必须包含文档关键字中至少一个项目中的所有单词,才能返回该文档。
示例:
“经理”不应该退回此文档。
“bus”和“manager”不应该返回此文档。
“餐厅经理”应该返回此文档。
“chef”应该返回此文档。
“餐厅经理厨师”应该返回此文档并获得更高分。
“餐厅经理无关的话”应该返回此文件。
“餐厅经理巴士”应该退回此文件,但理想情况下,不应该比“餐厅经理”得分更高。
评分很重要,所以我需要将其作为查询而不是过滤器。
我正在使用Elasticsearch 1.7。
答案 0 :(得分:1)
这可以通过以下设置来实现。
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
来对术语进行索引,以便 manager 的查询不会返回带有餐厅经理的文档。有关keyword analyzer的更多信息。现在搜索需要shingle filter从输入文本生成phrases
。像的文字这个餐厅经理很友好将被分成这家餐厅,餐厅经理,经理等你和你将得到预期的结果。您可以使用analyze api查看分析仪的工作原理。
您可以像这样索引文档
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"
}
}
}
希望这有帮助!