Elasticsearch过滤查询结果令人困惑

时间:2014-03-31 15:32:38

标签: elasticsearch

我正在尝试对具有大约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无关吗?

2 个答案:

答案 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上的文档。