Преобразование SQL в Elasticsearch DSL для случая AND - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть SQL запрос, подобный этому

sql_1 = "SELECT * FROM dd_s3data WHERE (yelp_address = '370 Barren Rd' OR yelp_businessname ILIKE '%Computer%') AND (yelp_state = 'CT' OR yelp_category ILIKE '%flooring%');"

Я пытаюсь преобразовать его в запрос Elasticsearch. Вот запрос, который я пробовал. Он дает OR результат вместо AND

es_query1 = {
    "query": {
        "constant_score": {
            "filter": {
                "bool": {
                    "should": [
                        {"match_phrase": {"yelp_address": "370 Barren Rd"}},
                        {"match": {"yelp_businessname": "Computer"}}
                    ],
                    "should": [
                        {"match": {"yelp_state": "CT"}},
                        {"match_phrase": {"yelp_category": "flooring"}}
                    ]
                }
            }
        }
    }
}

У меня есть даже большой запрос, который я должен преобразовать после того, как мой первый запрос верен.

sql_2 = "SELECT * FROM dd_s3data WHERE (yelp_address = '370 Barren Rd' OR yelp_businessname ILIKE '%Computer%') AND (yelp_state = 'CT' OR yelp_category ILIKE '%flooring%') AND yelp_noofreviews < 3.0 AND yelp_noofrating > 3.0;"

Как преобразовать мой SQL запрос, чтобы я получил AND результат вместо OR?

1 Ответ

1 голос
/ 23 апреля 2020

Для «ИЛИ» вы можете использовать «следует» с минимальным значением: 1

Для «И» вы можете использовать «должен»

Фильтр используется, если вы не хотите рассчитывать оценка за результат поиска. constant_score - возвращает каждый соответствующий документ с показателем релевантности, равным значению параметра boost.

В вашем случае может быть достаточно только одного фильтра, если вы хотите использовать constant_score, то оберните запрос фильтра с помощью constant_score и используйте boost

Запрос1:

{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "match_phrase": {
                      "yelp_address": "370 Barren Rd"
                    }
                  },
                  {
                    "match": {
                      "yelp_businessname": "Computer"
                    }
                  }
                ],
                "minimum_should_match":1
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match": {
                      "yelp_state": "CT"
                    }
                  },
                  {
                    "match_phrase": {
                      "yelp_category": "flooring"
                    }
                  }
                ],
                "minimum_should_match":1
              }
            }
          ]
        }
      }
    }
  }
}

Запрос2:

{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "match_phrase": {
                      "yelp_address": "370 Barren Rd"
                    }
                  },
                  {
                    "match": {
                      "yelp_businessname": "Computer"
                    }
                  }
                ]

              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match": {
                      "yelp_state": "CT"
                    }
                  },
                  {
                    "match_phrase": {
                      "yelp_category": "flooring"
                    }
                  }
                ],
                "minimum_should_match":1
              }
            },
            {
              "range": {
                "yelp_noofreviews": {
                  "lt": 3
                }
              }
            },
            {
              "range": {
                "yelp_noofrating": {
                  "gt": 3
                }
              }
            }
          ]
        }
      }
    }
  }
}
...