elasticsearch,kibana,Java,elasticsearch,Kibana" /> elasticsearch,kibana,Java,elasticsearch,Kibana" />

Elasticsearch使用Java API匹配所有查询

Elasticsearch使用Java API匹配所有查询,java,elasticsearch,kibana,Java,elasticsearch,Kibana,我们正在使用Elasticsearch 7.3.1版和Java API 我们正在实施“自由搜索”,这意味着在Elasticsearch的每个段中的所有字段中搜索一个值。如果该值至少出现在段的一个字段中,则应返回该值 到目前为止,我们已经使用了以下工具:QueryBuilders.multiMatchQuery(value),并且运行良好 今天,我们在映射文件中添加了一些嵌套的(Elasticsearch数据类型)类型字段 在该更改之后,上面的代码不再返回预期的结果 如何在不指定要搜索的每个字段的

我们正在使用Elasticsearch 7.3.1版和Java API

我们正在实施“自由搜索”,这意味着在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
    }
  }
}