Запрос вложенного пути из списка строк в Elasticsearch с помощью nest - PullRequest
0 голосов
/ 03 апреля 2019

Я знаю, что могу выполнить поиск по вложенному пути, когда хочу найти только одно значение, используя следующий код:

    .Query(q => q
        .Nested(n => n
            .Path(p => p.memberships)
                .Query(q2 => q2
                .Bool(b => b
                    .Should(s2 => s2
                        .Match(m => m.Field("memberships.Id").Query("20334089"))))))))

Это отлично работает.Я пытаюсь сделать запрос на основе списка строк в качестве значений полей.Я использую эту функцию TermAny, основанную на предыдущем ответе, и подумал, что она могла бы работать с этим для запроса с вложенным путем:

https://stackoverflow.com/a/36377068/1451776

private static QueryContainer TermAny<T>(QueryContainerDescriptor<T> descriptor, Field field, object[] values) where T : class
{
    QueryContainer q = new QueryContainer();
    foreach (var value in values)
    {
        q |= descriptor.Term(t => t.Field(field).Value(value));
    }
    return q;
}

Допустим, у меня есть списокИдентификаторы в строковом массиве myIDSArry, и я хочу использовать его для поиска во вложенном поле пути, называемом членством вasticsearch.Я пробовал это

    .Query(q => q
        .Nested(n => n
            .Path(p => p.memberships)
                .Query(q2 => q2
                    .Bool(b => b
                        .Should(s => TermAny(s, "memberships.Id", myIDSArry)))))))

Однако это возвращается как 0 хитов, и я знаю, что должны быть некоторые в результатах.Любые идеи о том, как я могу использовать это на основе списка строк для поиска?

1 Ответ

0 голосов
/ 03 апреля 2019

На самом деле я нашел ответ и публикую его на тот случай, если у других возникнет такой же вопрос. Это довольно просто, основываясь на том, что я знаю при запросе вasticsearch, иногда используется слово «ключевое слово», которое я знаю. Я исправил это, добавив .keyword

.Query(q => q
        .Nested(n => n
            .Path(p => p.memberships)
                .Query(q2 => q2
                    .Bool(b => b
                        .Should(s => TermAny(s, "memberships.Id.keyword", myIDSArry)))))))
...