Как преобразовать метод получения Python в запрос Elassearch? - PullRequest
0 голосов
/ 12 апреля 2019

Я хотел бы перевести методы python, чтобы получить конкретный термин из очищенного веб-сайта в запрос Elasticsearch.

Я прохожу стажировку, занимаюсь веб-программированием и эластичным поиском (и другими вещами ..), и я совершенно новичок в этой области (и в программировании в целом)

Мне дали задание очистить коды стран, а затем сделать запросы, чтобы получить код страны, используя другой код страны, например:

2-значный код страны для Австралии: «AU» и это трехзначный код страны: «AUS»

Итак, уточняя «AU», я бы хотел получить код «AUS».

Для этого я сделал скреп для получения всех кодов списка стран и создал код Python для получения этого результата, пример ниже:

  "took": 84,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 248,
    "max_score": 1,
    "hits": [
      {
        "_index": "countries-codes",
        "_type": "event",
        "_id": "Gx_gEGoBP2qGR-HHGMw3",
        "_score": 1,
        "_source": {
          "name": "Albanie",
          "alpha_2": "AL",
          "alpha_3": "ALB",
          "num": "8"
        }
      },

    def get_alpha2_by_alpha3(self, alpha_3):
        for element in self.countries_list.get_countries_list():
            if element['alpha_3'] == alpha_3.upper():
                return element['alpha_2']

Так что в основном я хотел бы перевести приведенный выше код в запрос, а затем внедрить его на веб-странице для внутреннего пользования

Пожалуйста, будьте как можно более явными, я новичок.

1 Ответ

0 голосов
/ 12 апреля 2019

При условии, что вы использовали динамические сопоставления по умолчанию при индексации документов, все ваши strings должны были отображаться как тип text и тип keyword.Следовательно, простой запрос term в сопоставлении keyword должен дать результаты, которые вы ищете.

Например, создание индекса с настройками по умолчанию выполняется просто следующим образом:

PUT countries-codes

Индексирование документа в том виде, в котором оно представлено, будет выглядеть следующим образом:

POST countries-codes/event
{
  "name": "Albanie",
  "alpha_2": "AL",
  "alpha_3": "ALB",
  "num": "8"
}

Теперь мы можем посмотреть на отображение нашего индекса, чтобы увидеть, как Elasticsearch отображал поля внутри:

GET countries-codes/_mapping

Результат:

{
  "countries-codes" : {
    "mappings" : {
      "event" : {
        "properties" : {
          "alpha_2" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "alpha_3" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "name" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "num" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    }
  }
}

Теперь мы просто выполним term запрос к сопоставлению keyword двухзначного кода страны, и мы получим обратно документ, представляющийсовпадение (или, если есть какие-то совпадения, все документы, представляющие эти совпадения):

GET countries-codes/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "alpha_2.keyword": "AL"
        }
      }
    }
  }
}

Обратите внимание, что это отфильтрованный запрос, так как вы не заинтересованы в оценке.Короче говоря, контекст фильтра будет быстрее, чем контекст запроса, поэтому используйте его при любой возможности.За дополнительной информацией обращайтесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

. Это приведет к тому, что документ, который вы опубликовали ранее, находится в массиве возврата hits:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "countries-codes",
        "_type" : "event",
        "_id" : "qGDmEWoBqkB-aMRpdfvt",
        "_score" : 0.0,
        "_source" : {
          "name" : "Albanie",
          "alpha_2" : "AL",
          "alpha_3" : "ALB",
          "num" : "8"
        }
      }
    ]
  }
}

.пустой массив хитов.На стороне клиента вы можете разобрать только тот элемент, который вам нужен.Если у вас были очень большие документы или возвращалось большое количество документов, вам нужно просмотреть source filtering - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html

Например:

GET countries-codes/_search
{
  "_source": "alpha_3", 
  "query": {
    "bool": {
      "filter": {
        "term": {
          "alpha_2.keyword": "AL"
        }
      }
    }
  }
}

В возвращенных совпаденияхобъект, вы заметите, что только часть результата, которую вы хотели получить, возвращается из документа:

"hits" : {
    "total" : 1,
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "countries-codes",
        "_type" : "event",
        "_id" : "qGDmEWoBqkB-aMRpdfvt",
        "_score" : 0.0,
        "_source" : {
          "alpha_3" : "ALB"
        }
      }
    ]
  }

Все примеры показаны с использованием Dev Tools / простых вызовов API.Поскольку вы используете Python, посмотрите на официально поддерживаемые библиотеки Elasticsearch:

Elasticsearch DSL - построен на основе нижнего уровня Elasticsearch-Py - https://elasticsearch -dsl.readthedocs.io / en /последний /

Elasticsearch-Py - https://elasticsearch -py.readthedocs.io / en / master /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...