Сравнение массивов Elasticsearch

Я новичок в elasticsearch, так что будьте добры.

Я пытаюсь хранить и запрашивать данные, помеченные N тегами. Я хочу сравнить массив поисковых запросов с сохраненным массивом и вернуть результаты в том порядке, в котором элементы соответствуют большинству тегов.

Пример набора данных:

{ name: "karl", tags: ["terrible", "programmer"] }
{ name: "bob", tags: ["awesome", "programmer"] }

Пример запроса, соответствующий обоим людям:

query: { tags: ["programmer"] }
result: [karl, bob]

И в этом примере возвращаются оба, но b имеет высокий балл, потому что совпало больше тегов, хотя Карл по-прежнему отображается, несмотря на то, что он не соответствует awesome.

query: { tags: ["programmer", "awesome"] }
result: [bob, karl]

У меня вот такой шкаф, но он, похоже, не на боб выше, чем у Карла.

{
  "query": {
    "bool": {
      "should": [
        { "match": { "tags": "programmer" } },
        { "match": { "tags": "awesome" } }
       ],
      "minimum_number_should_match": 1
    }
  }
}

Хотелось бы поддержки :-) Спасибо!


person Stono    schedule 06.07.2017    source источник
comment
Вы нашли что-нибудь, что могло бы помочь?   -  person Ismail    schedule 31.03.2020
comment
Оба запроса в вашем вопросе дадут более высокий балл большему количеству совпадений. Можете ли вы добавить фактический результат запроса и ожидаемый результат   -  person jaspreet chahal    schedule 31.03.2020


Ответы (2)


Его оценка bob значительно выше, чем karl: введите здесь описание изображения

Если вы хотите сопоставить оба тега, увеличьте оператор minimum: введите здесь описание изображения

Что по сути то же самое, что и группа bool-must:

GET karl/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "tags": "programmer"
          }
        },
        {
          "match": {
            "tags": "awesome"
          }
        }
      ]
    }
  }
}
person Joe Sorocin    schedule 31.03.2020

Если вам нужен только документ, который соответствует обоим (или даже большему) тегам, вам нужно использовать обязательный запрос (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html) Ваш запрос выглядит так:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "tags": "programmer" } },
        { "match": { "tags": "awesome" } }
       ]
    }
  }
}
person Claudio    schedule 03.04.2020