Elasticsearch — как выполнить сложный запрос, в котором каждое поле может иметь одно из двух значений

#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-запрос, который я объяснил. Заранее спасибо!!