Как использовать MultiTermVectorsAsync - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь вызвать приведенный ниже запрос, используя NEST

GET 123_original/_doc/_mtermvectors
{
  "ids": [
    "9a271078-086f-4f4b-8ca0-16376c2f49a7",
    "481ce3db-69bf-4886-9c38-fcb878d44925"
  ],
  "parameters": {
    "fields": ["*"],
    "positions": false,
    "offsets": false,
    "payloads": false,
    "term_statistics": false,
    "field_statistics": false
  }
}

NEST API (я думаю) будет выглядеть примерно так

var term = await elasticClient.MultiTermVectorsAsync(x =>
{
    return x.Index(indexOriginal)    // 123_original
        .Type(typeName)              // _doc
        .GetMany<ElasticDataSet>(ids.Keys) // list of strings
        .Fields("*")
        .FieldStatistics(false)
        .Positions(false)
        .Offsets(false)
        .TermStatistics(false)
        .Payloads(false);
});

Проблема в том, что приведенный выше API возвращает следующую ошибку Index name is null for the given type and no default index is set. Map an index name using ConnectionSettings.DefaultMappingFor<TDocument>() or set a default index using ConnectionSettings.DefaultIndex().

И это запрос, который он пытается выполнить, который имеет индекс в нем и пропускает идентификаторы, но работает в Кибане, когда идентификаторы установлены. 123_original/_doc/_mtermvectors?fields=%2A&field_statistics=false&positions=false&offsets=false&term_statistics=false&payloads=false

Я не могу найти документацию о том, как использовать Multi Term Vector с помощью NEST.

1 Ответ

0 голосов
/ 28 августа 2018

API многоточечных векторов в NEST не предоставляет возможность устанавливать только идентификаторы, он всегда предполагает, что вы передаете "docs".

Даже при прохождении

client.MultiTermVectors(mt => mt
    .Index("123_original")
    .Type("_doc")
    .GetMany<object>(ids)
    .Fields("*")
    .Positions(false)
    .Offsets(false)
    .Payloads(false)
    .TermStatistics(false)
    .FieldStatistics(false)
);

_index и _type для каждого id выводятся из object в GetMany<T>

POST http://localhost:9200/123_original/_doc/_mtermvectors?pretty=true&fields=*&positions=false&offsets=false&payloads=false&term_statistics=false&field_statistics=false 
{
  "docs": [
    {
      "_index": "users",
      "_type": "object",
      "_id": "9a271078-086f-4f4b-8ca0-16376c2f49a7"
    },
    {
      "_index": "users",
      "_type": "object",
      "_id": "481ce3db-69bf-4886-9c38-fcb878d44925"
    }
  ]
}

Я думаю, что в будущем это может быть раскрыто в клиенте более потребимо.

Хорошая новость заключается в том, что вы можете отправить точный запрос, который вы хотели бы, с клиентом низкого уровня, выставленным на IElasticClient, и при этом получить ответ высокого уровня

MultiTermVectorsResponse response = 
    client.LowLevel.Mtermvectors<MultiTermVectorsResponse>("123_original", "_doc", PostData.Serializable(new 
    { 
        ids = ids,
        parameters = new
        {
            fields = new[] { "*" },
            positions = false,
            offsets = false,
            payloads = false,
            term_statistics = false,
            field_statistics = false
        }
    }));

, который отправит следующий запрос:

POST http://localhost:9200/123_original/_doc/_mtermvectors?pretty=true 
{
  "ids": [
    "9a271078-086f-4f4b-8ca0-16376c2f49a7",
    "481ce3db-69bf-4886-9c38-fcb878d44925"
  ],
  "parameters": {
    "fields": [
      "*"
    ],
    "positions": false,
    "offsets": false,
    "payloads": false,
    "term_statistics": false,
    "field_statistics": false
  }
}
...