Поиск кратных терминов, которые присутствуют в разных вложенных документов | Elasticsearch - PullRequest
2 голосов
/ 09 января 2020

Я пытаюсь получить все документы, у которых есть какие-либо из терминов, представленных в запросе, и более высокий рейтинг тех документов, у которых больше всего терминов в этом поле, но поле, которое я пытаюсь найти, является вложенным. Поэтому, когда я пытаюсь выполнить запрос multi_match, он не соответствует более чем одному термину в этом поле. Он находит первое совпадение и учитывает оценку этого совпадения и не соответствует оставшимся условиям, чтобы увеличить оценку этого документа.

Вот отображение поля, которое я пытаюсь найти:

{
    "skills": {
        "type": "nested",
        "properties": {
            "name": {
                "type": "text",
                "analyzer": "standard_analyzer",
                "search_analyzer": "search_analyzer",
            },
            "rating": {
                "type":"byte"
            },
            "description": {
                "type": "text",
                "analyzer": "standard_analyzer",
                "search_analyzer": "search_analyzer"
            }
        }
    }
}

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

doc1: {
    skills: [
        {
            name: "HTML",
            rating: 4,
            description: "Whatever..."
        }
    ]
}

doc2: {
    skills: [
        {
            name: "Javascript",
            rating: 5,
            description: "Whatever..."
        }
    ]
}

doc3: {
    skills: [
        {
            name: "HTML",
            rating: 5,
            description: "Whatever..."
        },
        {
            name: "Javascript",
            rating: 4,
            description: "Whatever..."
        },
    ]
}

Поисковый запрос:

GET my-index/_search
{
  "query": {
    "nested": {
      "path": "skills",
      "score_mode": "sum",
      "query": {
        "multi_match": {
          "query": "HTML Javascript",
          "fields": [
            "skills.name"
          ],
          "operator": "or", 
          "type": "most_fields"
        }
      }
    }
  }, 
  "explain": true
}

Например. Когда я запрашиваю «HTML Javascript», он почему-то оценивает документ выше, который имеет последний термин ('Javascript') и даже не ищет 'HTML'. Я могу подтвердить, что разделение выполняется правильно на основе пробелов, оно правильно ранжирует документ, когда термины присутствуют в одном поле и не являются равнодушными вложенными документами. То, что я хочу, - это ранжировать документы выше, которые имеют как 'HTML', так и 'Javascript', в этом случае doc3 должен быть выше, чем doc1 и doc2.

...