在 Elasticsearch 版本 7.7 中跨多个索引进行查询

Query across multiple index in the Elasticsearch version 7.7

在elasticsearch 7.7版本中,索引中的多个_types被移除, 现在如果我们想跨多个索引查询,我们是按照下面的方式做的。

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

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

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

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

这可能吗?

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

谢谢,
哈利

我认为下面的代码应该有所帮助。请注意,您可以创建 TransportClient client 实例,如 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 this link and this guide 中提到的 Rest Client 应该可以帮助你如何从 [=72 迁移=] 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();

    }

}

下面是 output/console 中应该出现的内容:

2 hits

如果有帮助请告诉我!