我正在尝试对具有大约3M文档的Elasticsearch索引使用过滤查询,而我似乎无法按照我的预期使其工作。
详细说明,我的查询看起来像这样(我的索引是大学课程信息):
{
"query":{
"filtered":{
"query":{
"match_phrase_prefix":{
"course_abbreviation":"CS 3"
}
},
"filter":{
"term":{
"department_id":49599
}
}
}
}
}
这不会产生任何结果。但是,如果我给出一个完整的“course_abbreviation”(例如:CS 301),我会得到一个结果。
为了进一步增加我的困惑,如果我执行以下查询:
{
"query":{
"match_phrase_prefix":{
"course_abbreviation": "CS 3"
}
}
}
我得到多个文档,其中包含我想要的department_id(以及包含其他department_id的文档),并且还匹配course_abbreviations,例如“CS 301”,“CS 322”,“CS 365”等。
我错误地认为我的过滤后的查询会生成与未过滤的查询相同的文档,并且文档与其他department_ids无关吗?
答案 0 :(得分:0)
很难完全确定正在进行的卷曲娱乐活动(http://www.elasticsearch.org/help),但基于评论听起来你应该使用edgengram分析器。这适用于数据任何部分中的术语的部分匹配。
我的经验是,最好只在索引时应用edgengram扩展(即在index_analyzer中)。搜索方面,您只需传递条款并尝试匹配查询。
最好的问候
答案 1 :(得分:0)
我认为您的问题是由于Elasticsearch不会考虑“ CS 3”的所有后缀。默认情况下,仅考虑前50个后缀。如果包含Elasticsearch选择的50个后缀的文档与您的department_id
字词查询不匹配,则不会返回任何结果。就您而言,如果您拥有3M文档,这似乎不太可能。
您可以使用match_expansions
参数来增加所选后缀的数量。
{
"query":{
"filtered":{
"query":{
"match_phrase_prefix":{
"course_abbreviation":"CS 3",
"match_expansions": 100
}
},
"filter":{
"term":{
"department_id":49599
}
}
}
}
}
增加参数match_expansions
也会使您的请求速度变慢。请参阅match_phrase_prefix上的文档。