Рубрики
Без рубрики

Использование Elasticsearch с Python и Flask

В этой статье я дам некоторую информацию об использовании Python и Elasticsearch. Помечено Python, Elasticsearch, программированием.

Этот пост был впервые размещен в моем блоге на турецком

Прежде всего, мне очень жаль из-за моих грамматических ошибок.

Привет, в этой статье я дам некоторую информацию об использовании Python и Elasticsearch.

Elasticsearch – это открытый источник, спокойный, распределенный поиск и аналитический двигатель, построенный на Apache Lucene. ( через )

Прежде чем я начинаю статью, я должен сказать это; Я буду использовать Flask Framework. Мы отправим наши вопросы через почтальон.

Но вы уже разработаете его в совершенно разных сценариях в реальном мире приложения.

JDK должен быть установлен. В этой статье я не буду делиться какой-либо информацией о том, как установить JDK/JRE. Существуют разные документы о установке JDK. Они зависят от вашей операционной системы.

Если у вас нет JDK в вашей системе, вы должны установить его.

В этой статье я дам некоторую информацию о Elasticsearch версии 6.2.1.

Ссылки загрузки на официальный сайт включают в себя версии на основе Debian, RPM для Fedora/Redhat и аналогичные и MSI для Windows. Архивы Zip/Tar доступны для других.

Скачать ссылку: https://www.elastic.co/downloads/past-relases/elasticsearch-6-2-1

Если вы используете Ubuntu, установка будет такой:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.1.deb

sudo dpkg -i elasticsearch-6.2.1.deb

Поскольку у нас установлены Java зависимостями, мы не получим никаких ошибок. После этого начать упругое обслуживание:

sudo systemctl enable elasticsearch

Мы не будем делать самые большие конфигурации, потому что это базовый уровень. Но это будет хороший шаг для нас, чтобы узнать, как сделать некоторые основные конфигурации.

Файл конфигурации elasticsearch.yml Отказ Мы редактируем этот файл.

sudo nano /etc/elasticsearch/elasticsearch.yml

Давайте найдем Cluster.name с Ctrl + W и обновите его значение. Наше имя кластера может быть Элтон Джон. Конечно, если мы хотим.

cluster.name: eltonjohn
node.name: "Our First Node"

После этого нам нужно сохранить этот файл. Для того, чтобы сохранить файл, мы будем использовать эти комбинации клавиатуры;

CTRL + X
Y
Enter

Elasticsearch Service необходимо перезапустить.

sudo systemctl restart elasticsearch

Давайте проверим следующий запрос скручиваемости от экрана консоли:

curl -X GET 'http://localhost:9200'

Elasticsearch в настоящее время работает на 9200 порта. Но вы можете установить свой собственный номер порта. Вышеуказанный запрос вернул следующий результат.

{
    "name": "Our First Node",
    "cluster_name": "eltonjohn",
    "cluster_uuid": "FArhKpkhSZqjDfs3oSBMHw",
    "version": {
        "number": "6.2.1",
        "build_hash": "7299dc3",
        "build_date": "2018-02-07T19:34:26.990113Z",
        "build_snapshot": false,
        "lucene_version": "7.2.1",
        "minimum_wire_compatibility_version": "5.6.0",
        "minimum_index_compatibility_version": "5.0.0"
    },
    "tagline": "You Know, for Search"
}

Конечно, конечная точка запроса на elasticsearch не должно быть прослеживается от экрана сети активности, которые каждый может получить доступ.

По этой причине давайте сделаем это с Python и Flask следующим образом:

Во-первых, давайте настроим настроек колба с Virtualenv:

virtualenv venv

. venv/bin/activate

pip install Flask

Затем мы создадим модуль Elasticsearch-Py:

pip install elasticsearch

Дополнительная информация: https://elasticsearch-py.readthedocs.io/en/master/

Зависимости устанавливаются для Python. Давайте создадим файл под названием main.py и импортировать модуль elasticsearch-py и колбу.

from datetime import datetime
from flask import Flask, jsonify, request
from elasticsearch import Elasticsearch

Затем давайте инициализируем колбу и эластично-поиски модулей.

es = Elasticsearch()

app = Flask(__name__)

Мы создадим три метода. Обычно мы не должны делать это. Но я просто говорю о Elasticsearch.

@app.route('/', methods=['GET'])
def index():
    results = es.get(index='contents', doc_type='title', id='my-new-slug')
    return jsonify(results['_source'])

Этот первый метод поможет запросить от ID к Индекс и документ Тип мы указаны на Elasticsearch. Поскольку в данный момент нет контента, пустой результат будет возвращен.

Мы должны знать это; Индекс , doc_type и ID Значения полностью программируются.

Если вы покажете возвращаемое значение из метода получения, вам нужно будет посмотреть на _source ключ.

@app.route('/insert_data', methods=['POST'])
def insert_data():
    slug = request.form['slug']
    title = request.form['title']
    content = request.form['content']

    body = {
        'slug': slug,
        'title': title,
        'content': content,
        'timestamp': datetime.now()
    }

    result = es.index(index='contents', doc_type='title', id=slug, body=body)

    return jsonify(result)

На этом этапе предположим, что мы публикуем три значения формы в слизе, заголовок и содержании имени. Давайте передам эти возвращаемые значения к параметру тела метода индекса (). Мы сможем добавлять новые данные.

Если вы хотите, создайте индекс, измените тип документа и добавьте разные слизни.

Если значения, которые вы передаваете уже проиндексированы, версия обновляется вместо добавления новых данных.

Пойдем на последний шаг. Мы научимся искать на данный момент. Давайте создадим наш третий и последний метод для этого:

@app.route('/search', methods=['POST'])
def search():
    keyword = request.form['keyword']

    body = {
        "query": {
            "multi_match": {
                "query": keyword,
                "fields": ["content", "title"]
            }
        }
    }

    res = es.search(index="contents", doc_type="title", body=body)

    return jsonify(res['hits']['hits'])

В этом примере мы будем использовать свойство под названием multi_match Отказ Таким образом, мы сможем запросить более одного ключа тела. Текст поиска исходит из значения формы под названием ключевое слово . Отказ

Второй хитов в обратном значении будет массивом JSON. Итак, все значения с аналогичным содержанием будут перечислены.

{
    "_shards": {
        "failed": 0,
        "skipped": 0,
        "successful": 5,
        "total": 5
    },
    "hits": {
        "hits": [
            {
                "_id": "other-my-diff",
                "_index": "contents",
                "_score": 0.2876821,
                "_source": {
                    "content": "What kind of content is this?",
                    "slug": "other-my-diff",
                    "timestamp": "2018-02-11T16:08:10.409353",
                    "title": "Very different title second"
                },
                "_type": "title"
            },
            {
                "_id": "other-my",
                "_index": "contents",
                "_score": 0.2876821,
                "_source": {
                    "content": "What kind of content?",
                    "slug": "other-my",
                    "timestamp": "2018-02-11T16:00:51.613402",
                    "title": "Very different title"
                },
                "_type": "title"
            }
        ],
        "max_score": 0.2876821,
        "total": 2
    },
    "timed_out": false,
    "took": 3
}

Вот и все. На данный момент Elasticsearch не следует думать как база данных.

Все коды здесь. Если зависимости установлены, следующий код будет работать должным образом.

from datetime import datetime
from flask import Flask, jsonify, request
from elasticsearch import Elasticsearch

es = Elasticsearch()

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index():
    results = es.get(index='contents', doc_type='title', id='my-new-slug')
    return jsonify(results['_source'])


@app.route('/insert_data', methods=['POST'])
def insert_data():
    slug = request.form['slug']
    title = request.form['title']
    content = request.form['content']

    body = {
        'slug': slug,
        'title': title,
        'content': content,
        'timestamp': datetime.now()
    }

    result = es.index(index='contents', doc_type='title', id=slug, body=body)

    return jsonify(result)

@app.route('/search', methods=['POST'])
def search():
    keyword = request.form['keyword']

    body = {
        "query": {
            "multi_match": {
                "query": keyword,
                "fields": ["content", "title"]
            }
        }
    }

    res = es.search(index="contents", doc_type="title", body=body)

    return jsonify(res['hits']['hits'])

app.run(port=5000, debug=True)

Спасибо за чтение

Оригинал: “https://dev.to/itachiuchiha/using-elasticsearch-with-python-and-flask-2i0e”