Elasticsearch Java API - 构建查询

16

我已经阅读了 搜索API 的文档,但觉得它们描述不够详细(尽管写得非常好)。我正在尝试构建一个查询,但对所有可用选项的理解很少,并且找不到相关信息,当我构建一个查询时,我无法将在Sense中运行的查询转换为可以使用Java API 运行的查询。

在 Sense 中,我有以下内容:

GET index/_search
{
  "query": {
    "match" : {
      "name" : "some string"
    }
  }
}

并且在我的Java代码中我有:

node = nodeBuilder().client(true).clusterName(CLUSTER_NAME).node();
client = node.client();
QueryBuilder qb = QueryBuilders.termQuery("name", "some string");
SearchResponse response = client.prepareSearch("index") //
    .setQuery(qb) // Query
    .execute().actionGet();

但它们产生不同的搜索结果。我看不出它们的区别在哪里?同时是否有一个好的信息来源可能会有用?

1个回答

25

如果您希望这两个查询返回相同的结果,则需要使用相同类型的查询。在您的Sense查询中,您正在执行匹配查询:

"query": {
    "match" : {
      "name" : "some string"
    }
  }

但是在您的Java代码中,您正在执行一个termQuery:

QueryBuilder qb = QueryBuilders.termQuery("name", "some string");

所以为了回答你的问题,请在你的Java代码中使用匹配查询而不是其他查询:

QueryBuilder qb = QueryBuilders.matchQuery("name", "some string");
关于您的第二个问题,它有些宽泛。我建议您浏览文档并在StackOverflow上搜索。关于Java API,我会查看这里的概述和这里的有关通过Java进行查询DSL的信息。
我认为对Elasticsearch的工作原理有一个良好的普遍理解,以及熟悉通过REST API进行查询机制将有助于了解Java API。以下是一些不错的起点: http://joelabrahamsson.com/elasticsearch-101/ http://exploringelasticsearch.com/ http://java.dzone.com/articles/elasticsearch-getting-started

谢谢你的修复,它起作用了。关于文档,我已经阅读并反复阅读了你提供的所有链接中的所有内容,只有一个没有看到,我只是想搞清楚一些细节问题,我想最终我会弄明白的。 - Neilos
1
是的,我发现有些东西需要反复阅读才能掌握细节。ES很容易开始使用,但底层的复杂性有时可能令人望而生畏。 - John Petrone
2
@John Petrone,如何在Java中手动传递查询,例如这些{"query": {"bool": {"must": [{"range": {"sessionTime": {"gte": 1000, "lt": 5000}}}, {"match_phrase": {"os": "Windows"}}], "must_not": [], "should": []}} - Paul Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接