Запрос Elasticsearch с использованием NEST и QueryRaw

У меня есть следующий эластичный поисковый запрос:

 {
    "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
}
}]]];

person code_blue    schedule 27.04.2015    source источник
comment
Можете ли вы включить ошибку, которую вы получаете? Необработанный запрос выглядит нормально.   -  person Prabin Meitei    schedule 27.04.2015
comment
Не удалось выполнить фазу [запрос], не удалось выполнить все осколки; shardFailures {[xcv23jfTQtmaFhb1PQ62pQ][rpdw][0]: SearchParseException[testIndex][0]:   -  person code_blue    schedule 27.04.2015
comment
Не могли бы вы опубликовать, как выглядит запрос к ESEncoding.UTF8.GetString(resp.RequestInformation.Request);?   -  person Rob    schedule 27.04.2015
comment
Можете ли вы указать значение inputRequest?   -  person bittusarkar    schedule 27.04.2015
comment
inputRequest имеет тип JToken. Я просто отправляю вышеуказанный json в метод. Если я отправлю этот простой JSON, он заработает: {match_all:{}}   -  person code_blue    schedule 27.04.2015
comment
Включите более подробную информацию об ошибке. В нем будут дополнительные сведения о сбое шарда. Я попробовал ваш необработанный запрос, и он отлично работает.   -  person Prabin Meitei    schedule 27.04.2015
comment
Обновленный журнал ошибок выше   -  person code_blue    schedule 27.04.2015


Ответы (1)


Весь поисковый запрос не может быть передан в QueryRaw. Вы можете передать только тот запрос JSON, который должен быть включен в объект "query", в 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)
);

Я пропустил Sort() в приведенном выше поисковом запросе Nest, потому что вы все равно ничего с ним не делали.

person bittusarkar    schedule 27.04.2015
comment
Вы можете передать в QueryRaw только тот запрос JSON, который должен быть включен в объект запроса. Есть ли способ предотвратить такое поведение и передать всю строку запроса? - person daviddeath; 29.10.2015
comment
@daviddeath Для этого вам нужно использовать Raw-клиент Nest. Имейте в виду, что в этом случае ответ, который вы получите, также будет в необработанном формате. - person bittusarkar; 30.10.2015