Elasticsearch Нормализовал оценку с помощью документов Boost

#elasticsearch #elastic-stack

#эластичный поиск #эластичный пакет

Вопрос:

Я создаю запрос, который принимает набор кодов и местоположений гео_точек. Результатом должен быть список документов, упорядоченных по расстоянию до источника. Тем не менее, я хотел бы нормализоваться, допустим, набрав 10 баллов для документа в исходном местоположении и уменьшившись в зависимости от расстояния от источника. Мне действительно удалось создать этот поиск, но я также хотел бы увеличить оценку документа, если это включает дополнительную переменную в списке кодов.

Таковы требования:

  • Результатом должен быть список документов, оценка которых нормализуется в зависимости от расстояния от источника.
  • Возвращаемые документы должны содержать по крайней мере один yvar (т. е. yvar1 ИЛИ yvar2, ИЛИ yvar3, ИЛИ yvar…).
  • Только документы после определенной даты должны быть возвращены
  • Должны быть возвращены только документы, содержащие все данные, переданные в запросе.
  • Если в документе есть дополнительная переменная x (например, xvar4), оценка для этого документа должна быть увеличена на 0,1.Это тот бит, с которым я борюсь.

Это мое отображение:

 {  "mappings": {  "properties": {  "codes": {  "type": "keyword"  },  "date": {  "type": "date",  "format": "dd/MM/yyyy"  },  "coordinates": {"type": "geo_point"}  }  } }  

Некоторые примеры документов (ПРИМЕЧАНИЕ: Значение distanceToOrigin предназначено только для анализа выходных данных):

 { "create" : { "_index": "my-index", "_id" : "1" } } { "id": 1, "coordinates": { "lat": 51.5132, "lon": -0.1362}, "available capacity": 5, "last updated": "01/11/2021", "ResponseCodes": ["xvar1", "xvar2", "xvar3", "yvar1", "yvar2", "yvar3" ] ,"distanceTOorigin": 0 } { "create" : { "_index": "my-index", "_id" : "2" } } { "id": 2, "coordinates": { "lat": 52.9114, "lon": 0.5580}, "available capacity": 5, "last updated": "01/11/2021", "ResponseCodes": ["xvar1", "xvar2", "xvar3", "xvar4", "yvar1", "yvar2", "yvar3" ] ,"distanceTOorigin": 114 } { "create" : { "_index": "my-index", "_id" : "3" } } { "id": 3, "coordinates": { "lat": 51.4890, "lon": -0.6029}, "available capacity": 5, "last updated": "01/11/2021", "ResponseCodes": ["xvar1", "xvar2", "xvar3", "yvar1", "yvar2", "yvar3" ] ,"distanceTOorigin": 22 } { "create" : { "_index": "my-index", "_id" : "4" } } { "id": 4, "coordinates": { "lat": 57.2555, "lon": -3.2692}, "available capacity": 5, "last updated": "01/11/2021", "ResponseCodes": ["xvar1", "xvar2", "xvar3", "yvar1", "yvar2", "yvar3" ] ,"distanceTOorigin": 530 }  

Мой запрос, который создает нормализованный список документов:

 {  "query": {  "function_score": {  "query": { "match_all": {} },  "boost": "1",   "functions": [  {  "filter": [  { "range": { "date":{ "gte": "01/11/2000" }}},  { "terms_set": { "codes" : { "terms" : ["yvar1", "yvar2", "yvar3" ],  "minimum_should_match_script": { "source": "1" }}}}  ],  "random_score": {},   "weight": 1  },  {  "filter": [  { "terms_set": { "codes" : { "terms" : ["xvar1", "xvar2", "xvar3" ],  "minimum_should_match_script": { "source": "params.num_terms" }}}}  ],  "weight": 1  },   {  "exp": {  "coordinates": {  "origin": "51.5132, -0.1362",  "offset": "0km",  "decay": 0.5,  "scale":"350km"}  },  "weight": 10  }    ],   "max_boost": 10,  "score_mode": "max",  "boost_mode": "multiply"   }  } }  

Это то, что я пытался сделать в качестве запроса (заменяя запрос match_all), но это не работает, так как я получаю ненормализованный список

 "query": {  "bool": {  "should": [  {  "terms_set": { "codes" : { "terms" : ["xvar4"],  "minimum_should_match_script": { "source": "0" }, "boost" : 0.1}}  },  {  "match_all": {}  }  ]  }  }  

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

Ответ №1:

Я нашел решение, обратившись к _score в запросе script_score:

 {  "query": {  "script_score": {  "query": {  "match": { "codes": "xvar4" }  },  "script": {  "source": "_score  0.1"  }  }  } }