在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 链接:
- Search API我从中使用了上面的代码
- QueryBuilders
- SearchType
- paepareSearch method which returns SearchRequestBuilder instance
注意: 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/