在 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 链接:
- Search API 我从中使用了上面的代码
- QueryBuilders
- SearchType
- paepareSearch method which returns SearchRequestBuilder instance
注意: 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
如果有帮助请告诉我!
在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 链接:
- Search API 我从中使用了上面的代码
- QueryBuilders
- SearchType
- paepareSearch method which returns SearchRequestBuilder instance
注意: 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
如果有帮助请告诉我!