我在ElasticSearch中有以下实体:
{
"id": 123,
"entity-id": 1019,
"entity-name": "aaa",
"status": "New",
"creation-date": "2014-08-06",
"author": "bubu"
}
我尝试查询status = New的所有实体,因此上面的实体应该出现在那里。 我运行这段代码:
qesponse.setQuery(QueryBuilders.termQuery("status", "New"));
return qResponse.setFrom(start).setSize(size).execute().actionGet().toString();
但它没有结果。
如果我使用此代码(一般搜索,而不是特定字段),我会得到上述实体。
qResponse.setQuery(QueryBuilders.queryString("New");
return qResponse.setFrom(start).setSize(size).execute().actionGet().toString();
为什么?
答案 0 :(得分:0)
分析字符串字段的索引的默认值。因此,当您编写“status”=“New”时,它将使用standard_analyzer,并在分析后将其写为“new”。
因此,术语查询似乎不起作用,如果您希望按照指定的方式进行查询,请将该字段的映射写为“not_analyzed”。
了解更多信息。 link
答案 1 :(得分:0)
问题是术语查询与索引时使用标准分析器之间不匹配。除其他外,标准分析器在索引时对字段进行小写:
标准分析器
使用标准标记符构建标准类型的分析器 使用标准令牌过滤器,小写令牌过滤器和停止 令牌过滤器。
然而,Term查询在没有分析的情况下匹配:
定期查询
匹配包含术语(未分析)的字段的文档。 术语查询映射到Lucene TermQuery。
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
因此,在您索引字段状态的情况下,它变为" new"。但是,当您使用术语查询进行搜索时,它正在寻找" New" - 他们不匹配。它们与一般搜索匹配,因为一般搜索也使用标准分析器。