[英]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.