#elasticsearch #scoring #requestfiltering
Вопрос:
Я пытаюсь выполнить сложный запрос в Elasticsearch, но, по-моему, я не понимаю некоторой критической логики. Я не могу найти никакой документации о том, что я вижу, что происходит.
Сопоставление выглядит примерно так:
PUT my_geolocations { "mappings":{ "properties":{ "my_date":{"type":"date"}, "my_point":{"type":"geo_point"}, "region":{"type":"keyword"}, "country":{"type":"keyword"}, "car_type":{"type":"keyword"}, "dir_driving":{"type":"keyword'} } } }
Я постараюсь поместить некоторые примеры данных здесь утром.
lt; lt; примерные данные идут сюда gt; lt; примерные данные идут сюда gt;gt;
Запрос выглядит примерно так:
GET my_geolocations/_search { "query":{ "bool":{ "must":[ {"bool": {"should":[{"match":{"region":"north"}}, {"match":{"region":"south"}}] ,"minimum_should_match":1}}, {"bool": {"should":[{"match":{"country":"Canada"}}, {"match":{"country":"Timbuktu"}}] ,"minimum_should_match":1}}, {"bool": {"should":[{"match":{"dir_driving":"north"}}, {"match":{"dir_driving":"west"}}] ,"minimum_should_match":1}}, {"bool": {"should":[ {geo_distance": {"distance":"2500km","my_geolocation":{lat":30.12345,"lon":100.65432}}}, {geo_distance": {"distance":"25000km","my_geolocation":{lat":20.12345,"lon":80.65432}}}] , "minimum_should_match":1}} ], "filter":[{"range":{"my_date":{"gte":"now-7d/d", "lt":"now/d"}}}] } }, "_source":["country","region","car_type","dir_driving"] }
Я ожидаю, что он будет вести себя так, чтобы каждый раздел bool/should действовал как OR. Таким образом, по сути, в SQL этот запрос будет выглядеть примерно так:
SELECT g.country, g.region, g.car_type, g.dir_driving FROM my_geolocations g, user_sdo_geom_metadata m WHERE (gcountry ='Canada' or gcountry='Timbuktu') AND (g.region ='region1' or g.region='region1') AND (g.dir_driving='north' or g.dir_driving='west') AND (sdo_geom.within_distance(g.my_point, m.diminfo, 25000, g.sample_point, m.diminfo) AND g.sample_point='Georgia') or (sdo_geom.within_distance(g.my_point, m.diminfo, 35500, g.sample_point, m.diminfo) AND g.sample_point='El Salvador') AND g.date BETWEEN today() and today()-7;
Я не совсем уверен, что происходит, но я думаю, что это как-то связано со счетом, и он дает мне не оба варианта, а только один. Когда я создавал запрос, добавляя каждый раздел, я заметил, что отображался только один выбор, а не оба. Это не давало мне всего для Канады или Тимбукту, и я видел, что существуют обе ценности, а не только одна. То же самое касается и других разделов. Я подтвердил, что значения существуют для каждого отфильтрованного ИЛИ поля. В конце концов ничего не всплывает, особенно когда речь идет о запросе расстояния. Я попытался поместить их в фильтр, чтобы они не были подсчитаны, но запрос расстояния там не удался. Каждое значение существует, поэтому я ожидаю, что смогу увидеть документ для всего, но ничего не отображается. Как я упоминал ранее, я подозреваю, что это связано с оценкой и моим непониманием этого и ожиданием, что эти «ИЛИ» запросы будут работать как SQL «или» запросы», но они этого не делают. Итак, здесь две вещи: во-первых, чего я не понимаю? и, во-вторых, как мне написать это, чтобы оно функционировало как SQL-запрос, который я объяснил. Заранее спасибо!!