elasticsearch - Elasticsearch 7.7 版本中跨多个索引的查询

标签 elasticsearch elasticsearch-5 elasticsearch-java-api elasticsearch-7

在elasticsearch 7.7版本中,索引中的多个_type被删除, 现在,如果我们想跨多个索引进行查询,我们可以按以下方式进行。

/index1,index2/_search?q=type:tweet 

在 7.7 中,使用 Transport Java API 从多个索引查询的最佳方式是什么?

已编辑:
1)假设我有两个索引,“user”和“tweet”,我想搜索索引 - user 和 tweet,如下所示

如果我想将字段上的“user”索引查询为 {"username"= "Opster"} 并在字段的“tweet”索引中为 {"data"= "some_text"}

这可能吗?

2)我明白,每个索引都是 Elasticsearch 中的一个单独的分区,但是跨索引的搜索在 Elasticsearch 内部是如何工作的?

谢谢,
哈利

最佳答案

我认为下面的代码应该有帮助。请注意,您可以创建 TransportClient 客户端 实例,如 this link 中所述。

为了使用 Java API 执行搜索,下面的代码应该有帮助:

SearchResponse response = client.prepareSearch("index1", "index2")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(QueryBuilders.termQuery("type", "tweet"))                 // Query
        .setFrom(0).setSize(60)                                             // Set whatever size you'd want
        .get();

以下一些有用的 API 链接:

注意: ES 建议人们迁移到 Java Rest Client,如 this link 中所述。和 this guide应该可以帮助您了解如何从 Java API 迁移到使用 REST 客户端。

更新的答案:

假设我有两个索引

  • user 具有字段 username 且值为 Opster
  • tweet 包含字段 data 以及值 some text

为了简单起见,我将这两个字段设置为keyword类型

您要查找的内容如下

在 Elasticsearch 的查询 DSL 中:

POST /_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "_index": "user"
                }
              },
              {
                "term": {
                  "username": "Opster"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "_index": "tweet"
                }
              },
              {
                "term": {
                  "data": "some text"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Java API:

import java.net.InetAddress;
import java.net.UnknownHostException;

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

public class QueryForMultipleIndexes {


    public static void main(String[] args) throws UnknownHostException {

        // on startup

        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));       


        QueryBuilder firstQuery = new BoolQueryBuilder()
                                    .must(QueryBuilders.termQuery("_index", "user"))
                                    .must(QueryBuilders.termQuery("username", "Opster"));


        QueryBuilder secondQuery = new BoolQueryBuilder()
                                    .must(QueryBuilders.termQuery("_index", "tweet"))
                                    .must(QueryBuilders.termQuery("data", "some text"));

        //This is the should clause which in turn contains two must clause
        QueryBuilder mainQuery = new BoolQueryBuilder()
                                    .minimumShouldMatch(1)
                                    .should(firstQuery).should(secondQuery);

        SearchResponse response = client.prepareSearch("*")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(mainQuery)           
                .setFrom(0).setSize(60)
                .get();

        System.out.println(response.getHits().getTotalHits());

        // on shutdown
        client.close();

    }

}

以下是输出/控制台中应显示的内容:

2 hits

请告诉我这是否有帮助!

关于elasticsearch - Elasticsearch 7.7 版本中跨多个索引的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62334781/

相关文章:

c# - elasticsearch中长数据类型的通配符搜索问题

elasticsearch - 为什么我的Elasticsearch多重匹配查询仅查找前缀?

java - 如何使用 Elasticsearch 的 java api 调用 Groovy 脚本

Elasticsearch POST/my-index/_count 错误 406 Not Acceptable

elasticsearch - 安装聚合插件(离线)Logstash

elasticsearch - 如何实现Elasticsearch分片大小的自动控制?

javascript - mapper_parsing_exception无法使用node.js解析elasicsearch中的错误

ruby-on-rails - 如何使用SearchKick重新索引已存档和未存档的数据

elasticsearch - 请求在Elasticsearch中通过ID失败删除记录?

elasticsearch - 如何在elasticsearch中搜索标签