Правильный способ сопоставления хотя бы одного термина из списка терминов - PullRequest
0 голосов
/ 26 октября 2018

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

Я обнаружил, что этот код работает так, как я хочу:

...
  .Must(qs => qs
    .TermsSet(t => t
      .Field(tf => tf.categories)
      .Terms(searchCategories)
      .MinimumShouldMatchScript(ss => ss.Source("1"))
    )
  )
...

Но, кажется, действительно странно вставлять сценарий «1». Такое ощущение, что я могу упустить более простой способ сделать это.Мои подозрения верны?Есть ли лучший способ сделать это?

Обновление

Приведенный выше код создает этот запрос es:

...
  "must":[
    {
      "terms_set":{
        "categories":{
          "terms":[1],
          "minimum_should_match_script":{"source":"1"}
        }
      }
    }
  ]
...

Где termssearchCategories список

1 Ответ

0 голосов
/ 27 октября 2018

Указание источника "1" для terms set запроса минимум должен совпадать с полем сценария, которое будет возвращаемым значением выполненного Безболезненного сценария , который определяет минимальное количество терминов это должно соответствовать. Сценарий, конечно, может быть более сложным, чем возвращение одного значения на документ, что позволяет вам придумать более сложные требования соответствия для вариантов использования, таких как управление доступом на основе атрибутов .

Если вам нужен только любой термин из списка предоставленных терминов для сопоставления, тогда вы можете просто использовать terms запрос

var searchCategories = new [] {1 };

var searchResponse = client.Search<MyDocument>(s => s
    .Query(q => +q
        .Terms(t => t
            .Field(f => f.categories)
            .Terms(searchCategories)
        )
    )
);

что даст

{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "categories": [
              1
            ]
          }
        }
      ]
    }
  }
}

унарный + перегруженный оператор в запросе - это функция NEST, которая делает написание запросов bool немного более лаконичным.

...