Elasticsearch使用Java API匹配所有查询
我们正在使用Elasticsearch 7.3.1版和Java API 我们正在实施“自由搜索”,这意味着在Elasticsearch的每个段中的所有字段中搜索一个值。如果该值至少出现在段的一个字段中,则应返回该值 到目前为止,我们已经使用了以下工具:Elasticsearch使用Java API匹配所有查询,java,elasticsearch,kibana,Java,elasticsearch,Kibana,我们正在使用Elasticsearch 7.3.1版和Java API 我们正在实施“自由搜索”,这意味着在Elasticsearch的每个段中的所有字段中搜索一个值。如果该值至少出现在段的一个字段中,则应返回该值 到目前为止,我们已经使用了以下工具:QueryBuilders.multiMatchQuery(value),并且运行良好 今天,我们在映射文件中添加了一些嵌套的(Elasticsearch数据类型)类型字段 在该更改之后,上面的代码不再返回预期的结果 如何在不指定要搜索的每个字段的
QueryBuilders.multiMatchQuery(value)
,并且运行良好
今天,我们在映射文件中添加了一些嵌套的(Elasticsearch数据类型)类型字段
在该更改之后,上面的代码不再返回预期的结果
如何在不指定要搜索的每个字段的情况下,在段中的所有字段中执行搜索?您可以执行所有以前的elasticsearch版本的逻辑(我相信这在版本6之后被删除) 基本上是将
copy_添加到
参数中
PUT stackoverflow/_doc/1
{
"group" : "programmers",
"user" : [
{
"email" : "test@gmail.com",
"info" : "java developer"
},
{
"email" : "demo@wikipedia.org",
"info" : "css guru"
}
]
}
然后,您可以搜索all
字段
GET stackoverflow/_search
{
"query": {
"match": {
"all": "guru"
}
}
}
更新
下面是一个示例,说明如何修改您的查询,使其在不将copy\u复制到
GET stackoverflow/_search
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"multi_match": {
"query": "SEARCH_INPUT_HERE",
"fields": [
"group"
]
}
},
{
"nested": {
"path": "user",
"query": {
"multi_match": {
"query": "SEARCH_INPUT_HERE",
"fields": [
"user.email", "user.info"
]
}
}
}
}
]
}
}
}
更新2
此“复制到”正在将字段复制到all?它不会占用2倍的空间吗?没有其他方法可以做到这一点?这是在每次添加字段时不更改搜索的最简单方法。它不会使尺寸增加一倍,但会使尺寸增加一倍。我将在我的答案中添加一个示例,用于不复制到。我已添加了一个查询示例,该示例应与嵌套和简单字段类似。对嵌套字段的查询以及其他字段的查询都是多匹配查询。字段部分可以是通配符
*
,表示所有字段。如果您需要更多controlLet我们,您可以执行此“字段”:[“*”]
以及此“字段”:[“用户。*”]
。
GET stackoverflow/_search
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"multi_match": {
"query": "SEARCH_INPUT_HERE",
"fields": [
"group"
]
}
},
{
"nested": {
"path": "user",
"query": {
"multi_match": {
"query": "SEARCH_INPUT_HERE",
"fields": [
"user.email", "user.info"
]
}
}
}
}
]
}
}
}
public static void main(String[] args) {
String queryInput = "QUERY_INPUT_HERE";
String[] nested = {"user", "product"};
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(queryInput, "*");
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> shouldQueryBuilders = boolQueryBuilder.should();
shouldQueryBuilders.add(multiMatchQueryBuilder);
for(String path : nested) {
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery(path, multiMatchQueryBuilder, ScoreMode.Avg);
shouldQueryBuilders.add(nestedQueryBuilder);
}
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(searchSourceBuilder);
searchRequest.indices("MY_INDEX");
System.out.println(searchRequest.toString());
}
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "QUERY_INPUT_HERE",
"fields": [
"*^1.0"
],
"type": "best_fields",
"operator": "OR",
"slop": 0,
"prefix_length": 0,
"max_expansions": 50,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1.0
}
},
{
"nested": {
"query": {
"multi_match": {
"query": "QUERY_INPUT_HERE",
"fields": [
"*^1.0"
],
"type": "best_fields",
"operator": "OR",
"slop": 0,
"prefix_length": 0,
"max_expansions": 50,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1.0
}
},
"path": "user",
"ignore_unmapped": false,
"score_mode": "avg",
"boost": 1.0
}
},
{
"nested": {
"query": {
"multi_match": {
"query": "QUERY_INPUT_HERE",
"fields": [
"*^1.0"
],
"type": "best_fields",
"operator": "OR",
"slop": 0,
"prefix_length": 0,
"max_expansions": 50,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1.0
}
},
"path": "product",
"ignore_unmapped": false,
"score_mode": "avg",
"boost": 1.0
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
}
}