Как да дадем по-голяма тежест за един атрибут в низа за търсене на 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, след това проверете други атрибути

Python

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
Благодаря Bhavya, ако искам да търся Томас и Сачин {"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
Благодаря ти много, Bhavya - person ; 17.09.2020
comment
@Nons радвам се, че мога да ви бъда полезен :) Благодаря ви, че приехте отговора, би било чудесно, ако можете да гласувате и за това :) - person ESCoder; 17.09.2020
comment
Добре, @Nons Благодаря :) - person ESCoder; 17.09.2020
comment
последен въпрос, има ли някакъв начин да се даде йерархия за проверка на атрибутите. първо проверете professor.name, professor.email описание на курса - person ; 17.09.2020
comment
@BhavyaGupta: Вярвам, че заявка: (Томас) ИЛИ (Сачин) не е правилният синтаксис със заявка за muti_match. Ще съответства на документи с ИЛИ. Вместо това използвайте operator:or - person Sahil Gupta; 17.09.2020
comment
@SahilGupta благодаря, че посочи това :) Добавих и актуализацията на заявката за търсене с "operator":"OR". Но намирам, че няма голяма разлика в резултата в сравнение с предишната заявка за търсене (т.е. без изрично споменаване на "operator":"OR"). И ако ви е харесал отговорът, моля, не забравяйте да гласувате и за отговора :) - person ESCoder; 17.09.2020
comment
@Nons Мисля, че това може да е възможно чрез използване на bool заявки, но това ще бъде напълно различен подход. Би било по-добре, ако публикувате друг въпрос, с вашите нови изисквания. Моля, пишете ми, когато публикувате новия въпрос, и определено ще се опитам да отговоря на него :) - person ESCoder; 17.09.2020
comment
Благодаря @Nons, ще премина през това - person ESCoder; 17.09.2020
comment
@Nons добави моя отговор, моля, прегледайте този stackoverflow.com/a/63937212/10348758 - person ESCoder; 17.09.2020