#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" } } } }