我正在使用以下查询来搜索文档:

QueryBuilder qb = matchQuery(
                "username_field",
                "user123"
            );
SearchResponse response = Client().prepareSearch("users_dashboard").setQuery(qb)
                .setSource("username_field")
                .execute().actionGet();

但是我希望它返回给我一个包含确切用户名的文档。但是当前返回的是一个示例:
搜索user123返回以下所有内容:
user123
user123 lastname
firstname user123

但是我只想返回user123

我正在使用Elasticsearch 2.1.0

最佳答案

您需要使用term query进行完全匹配。我假设您正在使用standard analyzer(默认)作为user field,因此您在inverted index中具有以下标记

  • user123(doc 1,2,3)
  • 名字(doc 3)
  • 姓氏(doc 2)

  • 使用match query时,它将返回所有三个文档。您需要将用户字段映射为index : not_analyzed,以便不执行任何分析。您的反向索引将如下所示。
  • user123
  • user123姓氏
  • 名使用者user123

  • 然后此查询将为您提供所需的结果
    QueryBuilder qb = termQuery(
                    "username_field",
                    "user123"
                );
    

    09-12 09:19