Как придать больший вес одному атрибуту в строке поиска запроса DSL

Ниже приведены примеры данных в elasticsearch.

   PUT /data/test/1
 {
       "id": "Accounting 101",
       "room": "E3",
       "professor": {
           "name": "Thomas Baszo",
           "email": "[email protected]"
           },
       "students_enrolled": 27,
       "course_description": " financial statements"
   }
   
   PUT /data/test/2
   {
       "name": "Accounting 101",
       "room": "E3",
       "professor": {
           "name": "Sachin Baszo",
           "email": "[email protected]"
           },
       "students_enrolled": 27, 
       "course_description": "Thomas  Thomas Thomas Thomas "
   }

Ниже приведен запрос

GET /_search
{
  "query": {
    "query_string": {
      "query": "(*Thomas*)"
    }
  }
}

В моем выводе второй документ будет отображаться как первый, поскольку он содержит Томаса 4 раза в описании.

  • Мне нужно придать больший вес professor.name, он должен сначала показать проверку, если нет, то проверить Professor.email, а затем проверить другие атрибуты.

питон

es.search(index="data", body={"query": {"query_string": {"query": "(*Thomas*)"}}})


person Community    schedule 17.09.2020    source источник


Ответы (1)


Не рекомендуется использовать query_string, как указано в официальная документация ES:

Поскольку он возвращает ошибку для любого недопустимого синтаксиса, мы не рекомендуем использовать запрос query_string для полей поиска.

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

Вы можете использовать Boost, где

Отдельные поля могут повышаться автоматически — больше учитываться при оценке релевантности — во время запроса

Добавление рабочего примера с отображением индекса, поисковым запросом и результатом поиска

Сопоставление индекса:

{
    "mappings": {
        "properties": {
            "professor": {
                "properties": {
                    "name": {
                        "type": "text",
                        "boost": 2
                    }
                }
            }
        }
    }
}

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

 {
  "query": {
    "multi_match" : {
      "query": "Thomas", 
      "fields": [ "course_description", "professor.name" ] 
    }
  }
}

Результат поиска:

"hits": [
            {
                "_index": "stof_63933144",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.3862942,     <-- note this
                "_source": {
                    "id": "Accounting 101",
                    "room": "E3",
                    "professor": {
                        "name": "Thomas Baszo",
                        "email": "[email protected]"
                    },
                    "students_enrolled": 27,
                    "course_description": " financial statements"
                }
            },
            {
                "_index": "stof_63933144",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.1090355,   <-- note this
                "_source": {
                    "name": "Accounting 101",
                    "room": "E3",
                    "professor": {
                        "name": "Sachin Baszo",
                        "email": "[email protected]"
                    },
                    "students_enrolled": 27,
                    "course_description": "Thomas  Thomas Thomas Thomas "
                }
            }
        ]

Обновление 1:

Поисковый запрос для поиска Thomas ИЛИ Sachin

 {
      "query": {
        "multi_match" : {
          "query": "(Thomas) OR (Sachin)", 
          "fields": [ "course_description", "professor.name" ] 
        }
      }
    }

Обновление 2:

Запрос на множественное совпадение с использованием "operator":"OR"

{
  "query": {
    "multi_match" : {
      "query": "Thomas Sachin", 
      "fields": [ "course_description", "professor.name" ] ,
      "operator":"OR",
      "type":"cross_fields"
    }
  }
}
person ESCoder    schedule 17.09.2020
comment
Спасибо, Бхавья, если я хочу найти Томаса и Сачина {"query": {"query_string": {"query": "(*Thomas* OR *Sachin*)"}}}), как это добавить? - person ; 17.09.2020
comment
без изменения термина query можем ли мы это сделать - person ; 17.09.2020
comment
@Nons, пожалуйста, просмотрите мой обновленный ответ и дайте мне знать, сработал ли приведенный выше поисковый запрос для вас или нет? - person ESCoder; 17.09.2020
comment
Большое спасибо, Бхавья. - person ; 17.09.2020
comment
@Nons рад, что смог быть вам полезен :) Спасибо, что приняли ответ, было бы здорово, если бы вы тоже могли проголосовать за это :) - person ESCoder; 17.09.2020
comment
Хорошо, @Nons Спасибо :) - person ESCoder; 17.09.2020
comment
последний вопрос, есть ли способ дать иерархию для проверки атрибутов. сначала проверьте имя профессора, имя профессора и адрес электронной почты, описание курса - person ; 17.09.2020
comment
@BhavyaGupta: я считаю, что запрос: (Томас) ИЛИ (Сачин) не является правильным синтаксисом для запроса muti_match. Он будет сопоставлять документы с ИЛИ. Вместо этого используйте оператор: или - person Sahil Gupta; 17.09.2020
comment
@SahilGupta спасибо, что указали на это :) Я также добавил обновление поискового запроса с "operator":"OR". Но я обнаружил, что нет большой разницы в оценке по сравнению с предыдущим поисковым запросом (т.е. без явного упоминания "operator":"OR"). И если вам понравился ответ, пожалуйста, не забудьте также проголосовать за ответ :) - person ESCoder; 17.09.2020
comment
@Nons Я думаю, что это возможно с использованием логических запросов, но это будет совершенно другой подход. Было бы лучше, если бы вы опубликовали еще один вопрос с вашими новыми требованиями. Пожалуйста, пингуйте меня, когда вы опубликуете новый вопрос, и я обязательно постараюсь ответить на него :) - person ESCoder; 17.09.2020
comment
Спасибо @Nons, я пройду через это - person ESCoder; 17.09.2020
comment
@Nons добавил мой ответ, пожалуйста, просмотрите этот stackoverflow.com/a/63937212/10348758 - person ESCoder; 17.09.2020