【问题标题】:Elasticsearch query using NEST & QueryRaw使用 NEST 和 QueryRaw 进行 Elasticsearch 查询
【发布时间】:2015-04-27 20:50:33
【问题描述】:

我有以下 Elastic Search 查询:

 {
    "query": {
        "filtered": {
            "query": {
                "multi_match": {
                    "query": "main",
                    "type": "cross_fields",
                    "fields": [
                        "field1^5",
                        "test",
                        "field2",
                        "abc"
                    ],
                    "operator": "and"
                }
            }
        }
    },
    "sort": [],
    "from": 0,
    "size": 20
}

我正在尝试使用 NEST 客户端进行弹性搜索并使用“QueryRaw”属性运行此查询,但出现错误。

有人可以在我出错的地方提供一些输入

var uri = new Uri("Elastic_Search_Cluster_Name");
var settings = new ConnectionSettings(uri, defaultIndex: "testIndex");
var client = new ElasticClient(settings);
var resp=client.Search<dynamic>(q => 
q.Type("mappingType").QueryRaw(inputRequest.ToString())
);

错误日志:

Failed to execute phase [query], all shards failed; shardFailures {[27THF3S_QuaBLRj11MgqfA][testIndex][0]: RemoteTransportException[[pdm64-ironman][inet[/server]][indices:data/read/search[phase/query]]]; nested: SearchParseException[[testIndex][0]: query[abc:main field2:main test:main field1:main^5.0],from[-1],size[-1]: Parse Failure [Failed to parse source [{
  "query": {
  "filtered": {
    "query": {
      "multi_match": {
        "query": "main",
        "type": "cross_fields",
        "fields": [
          "field1^5",
          "test",
          "field2",
          "abc"
        ],
        "operator": "and"
      }
    }
  },
  "sort": [],
  "from": 0,
  "size": 20
}
}]]]; nested: ElasticsearchParseException[Expected field name but got START_ARRAY "sort"]; }{[b5YxyDCcQEmSlCd9y3Sfww][testIndex][1]: RemoteTransportException[[pdm65-hulk][inet[/server]][indices:data/read/search[phase/query]]]; nested: SearchParseException[[testIndex][1]: query[abc:main field2:main test:main field1:main^5.0],from[-1],size[-1]: Parse Failure [Failed to parse source [{
  "query": {
  "filtered": {
    "query": {
      "multi_match": {
        "query": "main",
        "type": "cross_fields",
        "fields": [
          "field1^5",
          "test",
          "field2",
          "abc"
        ],
        "operator": "and"
      }
    }
  },
  "sort": [],
  "from": 0,
  "size": 20
}
}]]];

【问题讨论】:

  • 你能包括你得到的错误吗?原始查询看起来不错。
  • 执行阶段[查询]失败,所有分片失败; shardFailures {[xcv23jfTQtmaFhb1PQ62pQ][rpdw][0]: SearchParseException[testIndex][0]:
  • 您能否发布对 ES 的请求看起来像Encoding.UTF8.GetString(resp.RequestInformation.Request);
  • 你能提一下inputRequest的值吗?
  • inputRequest 的类型为“JToken”。我只是将上面的 json 发送到该方法。如果我发送这个简单的 JSON,它的工作原理:{"match_all":{}}

标签: elasticsearch nest elasticsearch-net


【解决方案1】:

无法将整个搜索请求传递到QueryRaw。您只能将应该包含在 "query" 对象中的 JSON 请求传递给 QueryRaw。因此,如果您将以下 JSON 正文传递给 QueryRaw 它应该可以工作。

{
   "filtered": {
      "query": {
         "multi_match": {
            "query": "main",
            "type": "cross_fields",
            "fields": [
               "field1^5",
               "test",
               "field2",
               "abc"
            ],
            "operator": "and"
         }
      }
   }
}

"sort""from""size" 对象不在 "query" 内,因此 Nest 无法解析您的请求。

您的 Nest 代码应如下所示:

var uri = new Uri("Elastic_Search_Cluster_Name");
var settings = new ConnectionSettings(uri, defaultIndex: "testIndex");
var client = new ElasticClient(settings);
var resp = client.Search<dynamic>(q => q
    .Type("mappingType")
    .QueryRaw(<raw query string>)
    .From(0)
    .Size(20)
);

我在上面的 Nest 搜索请求中省略了 Sort(),因为无论如何你都没有对它做任何事情。

【讨论】:

  • “您只能将应该包含在“查询”对象中的 JSON 请求传递给 QueryRaw”——有没有办法防止这种行为并传递整个查询字符串?跨度>
  • @daviddeath 为此,您需要使用 Nest 的 Raw 客户端。请注意,在这种情况下,您将收到的回复也将是原始格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多