簡體   English   中英

ElasticSearch 轉換 Rest 查詢嵌套字段到客戶端 Scala/Java 代碼

[英]ElasticSearch Convert Rest Query for nested field to client Scala/Java code

我找不到有關如何將嵌套查詢從 ES 官方示例轉換為 Scala/Java 代碼的文檔

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html

GET my-index-000001/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }},
            { "match": { "user.last":  "Smith" }} 
          ]
        }
      }
    }
  }
}

在 Scala 我試過

  import org.elasticsearch.index.query.QueryBuilders._
  ...

  val q = boolQuery()
  q.must(termQuery("user.first", "Alice"))
  q.must(termQuery("user.last", "White))
  nestedQuery("user", q, ScoreMode.None)
        

但是在檢查結果查詢時它是不一樣的。

結果查詢類似於(它的裁剪版本,因為原始查詢要大得多):

 "nested" : {
                            "query" : {
                              "bool" : {
                                "must" : [
                                  {
                                    "match" : {
                                      "user.first" : {
                                        "query" : "Alice",
                                        "operator" : "OR",
                                        "prefix_length" : 0,
                                        "max_expansions" : 50,
                                        "fuzzy_transpositions" : true,
                                        "lenient" : false,
                                        "zero_terms_query" : "NONE",
                                        "auto_generate_synonyms_phrase_query" : true,
                                        "boost" : 1.0
                                      }
                                    }
                                  },
                                  {
                                    "match" : {
                                      "user.last" : {
                                        "query" : "Smith",
                                        "operator" : "OR",
                                        "prefix_length" : 0,
                                        "max_expansions" : 50,
                                        "fuzzy_transpositions" : true,
                                        "lenient" : false,
                                        "zero_terms_query" : "NONE",
                                        "auto_generate_synonyms_phrase_query" : true,
                                        "boost" : 1.0
                                      }
                                    }
                                  }
                                ],
                                "adjust_pure_negative" : true,
                                "boost" : 1.0
                              }
                            },
                            "path" : "user",
                            "ignore_unmapped" : false,
                            "score_mode" : "none",
                            "boost" : 1.0
                          }
                        }

我得到的實際異常是在單元測試中:

. java.io.NotSerializableException: org.elasticsearch.client.Response
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputSt[info] - should excluded keywords only *** FAILED ***
[info]   org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]
[info]   at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:176)
[info]   at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:1933)
[info]   at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1910)
[info]   at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1667)
[info]   at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1624)
ream.java:1509)
    at java.io.Obje[info]   at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1594)
[info]   at org.elasticsearch.client.RestHighLevelClient.search(RestHighLevelClient.java:1110)

您的 Scala 代碼正在生成正確的查詢。 基本上這里發生的是,它在查詢中添加了一些帶有值的默認參數,因此,與原始查詢相比,您的查詢看起來更大。 這是由 Java 和 Scala elasticsearch 客戶端完成的(可能是其他語言客戶端也在做同樣的事情)。 此外,當您在 Kibana 中創建 DSL 查詢時,運行時會將所有默認參數添加到您的查詢中。

以下是查詢中具有默認值的參數:

"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0

下面我刪除了通過代碼添加到您的查詢中的所有默認參數:

{
    "nested": {
        "query": {
            "bool": {
                "must": [
                    {
                        "match": {
                            "user.first": {
                                "query": "Alice"
                            }
                        }
                    },
                    {
                        "match": {
                            "user.last": {
                                "query": "Smith"
                            }
                        }
                    }
                ]
            }
        },
        "path": "user"
        
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM