1

在elasticsearch 7.7版本中,索引中的多个_types被删除了,现在如果我们想跨多个索引进行查询,我们是通过以下方式进行的。

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

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

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

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

这可能吗?

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

谢谢,
哈利

4

1 回答 1

4

我认为下面的代码应该有所帮助。请注意,您可以创建此链接TransportClient client中提到的实例

为了使用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 ,本指南应该可以帮助您了解如何从 Java API 迁移到使用 REST Client。

更新答案:

假设我有两个索引

  • userusername有值的字段Opster
  • tweetdata有值的字段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

让我知道这是否有帮助!

于 2020-06-12T14:19:18.193 回答