Цель лекции: Рассмотреть инструмент для организации полнотекстового поиска ElasticSearch; ознакомиться с AngularJS; рассмотреть простейший пример использования AngularJS в проекте Django; создать пример индекса для полнотекстового поиска.
Ключевые термины: Django, REST, ElasticSearch, AngularJS, поиск, индекс, веб, тег, модель, данные, html, запрос, конфигурация, сервер, API
Веб - разработка эволюционировала со временем, и пользователи потребляют информацию на таком большом количестве устройств. Веб изначально был адаптирован для устройств с большим экраном, но последние тенденции показывают, что потребление устройств с небольшим размером экрана которые можно держать в руке, увеличивается. Таким образом, растет необходимость предоставлять Веб для устройств с маленьким экраном, но эти устройства очень чувствительны в плане энергии. Таким образом существует необходимость отделить оболочку программы от внутреннего интерфейса в Django.
Однo из таких наиболее широко используемых решений заключается в использовании внутреннего интерфейса Django с помощью API, позволяющем в оболочке программы использовать его с Django. Использование AngularJS для такой ситуации является наиболее оптимальным.
REST стал будущим веб разработки и REST API - больше чем целая часть современного Веб. С увеличением фрагментации среди устройств, появляется необходимость единой минимальной конечной точки, которая не выполняет никакой операции представления. Для экземпляра, получение информации или связь может быть настолько быстрой, насколько это возможно, и может быть также масштабирована, и представление или бизнес-логика для этого остается за современными браузерами, использующими для этого фреймворк оболочки программы.
AngularJS — это современный JavaScript фреймворк, который используется для создания сложных веб-приложений в браузере.
С момента рождения AngularJS в 2009 году он развивается очень быстро и широко признан как основной рабочий фреймворк оболочки программы. В настоящее время он поддерживается Google.
AngularJS имеет очень интересную историю рождения. Он получил свое большое внимание, когда один из создателей Angular создал заново веб-приложение за 3 недели, которое изначально собрался разработать за 6 месяцев, уменьшив количество строк кода от 17000 до 1000.
Многие возможности AngularJS стоят над обычными фреймворками для веб-разработки. Среди них, несколько уникальных и инновационных возможностей, вроде двухсторонней привязки, внедрения зависимостей, легкого тестирования кода и расширение диалекта HTML с помощью директив.
На стороне сервера мы можем использовать Django REST framework или Tastypie для остальных конечных точек. Затем мы можем использовать AngularJS, который сконцентрирован на модели MVC, чтобы поощрять создание легко поддерживаемых модулей.
Веб-технологии эволюционировали от синхронных к асинхронных, то есть запросы веб-сайта теперь сильно используют асинхронные вызовы для обновления его содержимого без перезагрузки страницы, примером которого является ваша стена записей Facebook.
AngularJS является одним из решений ,когда требуется лучший способ асинхронной веб-разработки Django.
В следующем примере мы будем использовать AngularJS для создания одной страницы, которая использует API твитов, который мы уже создали.
Мы будем использовать AngulaJS, чтобы представить список всех твитов, но прежде, нам нужно познакомиться с ключевыми терминами AngularJS:
Когда мы проектируем веб-приложение на основе API, существует высокая вероятность того, что оба (внутренний интерфейс API и оболочка веб-приложения) из них находятся на разных серверах. Таким образом воз-никает необходимость настроить Django для совместного использование ресурсов между разными источниками (Cross-origin resource sharing, CORS).
Из определения, объясняемого в Википедии:
Cross-origin resource sharing (CORS, "совместное использование ресурсов между разными источниками") — технология современных браузеров, которая позволяет предоставить веб-странице доступ к ресурсам другого домена
Нам нужно изменить наше Django API, чтобы разрешить запросы от других серверов .Теперь мы обновим файл api.py приложения tweets, чтобы разрешить the requests для межсайтового запроса сервера:
class CORSResource(object):
"""
Adds CORS headers to resources that subclass this.
"""
def create_response(self, *args, **kwargs):
response = super(CORSResource, self).create_response(*args, **kwargs)
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Headers'] = 'Content-Type'
return response
def method_check(self, request, allowed=None):
if allowed is None:
allowed = []
request_method = request.method.lower()
allows = ','.join(map(unicode.upper, allowed))
if request_method == 'options':
response = HttpResponse(allows)
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Headers'] = 'Content-Type'
response['Allow'] = allows
raise ImmediateHttpResponse(response=response)
if not request_method in allowed:
response = http.HttpMethodNotAllowed(allows)
response['Allow'] = allows
raise ImmediateHttpResponse(response=response)
return request_method
После добавления этого класса, мы можем создать подкласс любого ресурса, который мы хотим подвергнуть для междудоменных запросов. Теперь мы изменим наш класс Tweet, чтобы сделать его доступным для межсайтового доступа:
Давайте обновим класс Tweet в соответствие со следуюшим:
class TweetResource(CORSResource, ModelResource):
class Meta:
queryset = Tweet.objects.all ()
resource_name = 'tweet'
Теперь ресурс tweet готов для доступа из разных доменов.
Ниже приведен простой пример AngularJS:
Создайте html-файл под названием app.html (так как этот файл независим от нашего существующего проекта Django, мы можем создать его вне папки проекта) со следующим содержимым. Сейчас эта страница использует AngularJS с локального диска, вы можете также импортировать страницу из CDN:
<html ng-app = "tweets" >
<head>
<title>Tweets App</title>
"script src="angular.min.js"></script>
</head>
<body>
<div ng-controller="tweetController">
<table>
<tr ng-repeat="tweet in tweets">
<td>{{ tweet.country }}</td>
<td>{{ tweet.text }}</td>
</tr >
</table>
</div>
<script src="app.js"></script>
</body>
</html>
В следующем коде, директива ng-controller срабатывает во время отображения, который обрабатывает любую бизнес-логику и внедряет вычисляемые модели внутрь области. Тег <div ng-controller="tweetController"> - один из примеров, где параметр tweetController обрабатывается перед отображением div.
Полностью наша бизнес-логика описывается на Javascript в файле app.js:
var app = angular.module('tweets', []);
app.controller("tweetController", function($scope,$http) {
$http({ headers: {'Content-Type': 'application/json;
charset=utf-8'}, method: 'GET',
url: "http://127.0.0.1:8000/api/vl/tweet/?format=json"
})
.success(function (data) {
$scope.tweets = data.objects;
})
}>;
Этот файл app.js делает запрос к конечному API твитов и внедряет объект tweet в область, которая отображается AngularJS в представлении (app.html) с директивой цикла ng-repeat:
<tr ng-repeat="tweet in tweets"></tr>
<td>{{tweet.country}}</td>
<td>{{tweet.text}}</td>
</tr>
Это всего лишь базовое приложение AngularJS, тогда как продвинутая веб-разработка полностью переместилась из разработки внутреннего интерфейса к разработке оболочки. Приложения на основе AngularJS идеально подходит для полного одностраничного приложения.
Поиск стал неотъемлемой частью большинства приложений, с которыми мы имеем дело сегодня. От Facebook для поиска друга, до Google, где вы ищете по всему Вебу, все от блога до журнала требует возможностей поиска для разблокировки скрытой информации на веб-сайте.
Веб развивается с экспоненциальной скоростью. Мерить данные гигабайтами теперь уже устарело и сотни терабайт структурированных и неструктурированных данных генерируется каждый день.
Elasticsearch (ES) лучше, чем другие альтернативы, потому что, помимо полнотекстового поиска, он обеспечивает полноценную аналитику данных в реальном времени и масштабируемость, с мощной поддержкой инфраструктуры данных кластеров.
Elasticsearch (ES) также дает вам простой REST API, который можно легко интегрировать с любым пользовательским приложением и окружение разработки Django (в более широком смысле, Python) дает много крутых, из коробки, инструментов для имплементации Elasticsearch (ES).
Веб-сайт ) содержит подробную документацию и там есть много замечательных онлайн-примеров, которые помогут вам построить любые виды поиска, которые вам нужны. Путем полного использования Elasticsearch, вы, вероятно, сможете построить свой собственный "Google" с его помощью.
Во-первых, установите Java. Затем скачайте и распакуйте Elasticsearch. Вы можете либо запустить ES как службу или вы можете стартовать ES сервер, используя следующие команды оболочки (измените пути в соответствии с вашей системой):
Set JAVA_HOME = \absolute\path\to\Java \absolute\path\to\ES\bin\elasticsearch
Если все сделано правильно, можно набрать следующий URL-адрес в вашем браузере:
Это даст вам ответ следующим образом, но с различным параметром build_hash:
{
"status" : 200,
"name" : "MN-E (Ultraverse)",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.4.1",
"build_hash" : "89d3241d670db65f994242c8e8383bl69779e2d4",
"build_timestamp" : "2014-11-26T15:49:29Z",
"build_snapshot" : false,
"lucene_version" : "4.10.2"
},
"tagline" : "Вы знаете, это все для поиска"
}
Elasticsearch поставляется с базовой конфигурации для базового развертывания. Однако если вы хотите настроить конфигурацию, обратитесь к онлайн документации и измените конфигурацию Elasticsearch в файле elasticsearch.yml.
Django может быть интегрирован с Elasticsearch с помощью базового программирования Python. В этом примере мы будем использовать библиотеку запросов Python для того, чтобы сделать запрос от Django к Elasticsearch. Мы можем установить запросы, введя следующий код:
pip install requests
Для функции поиска, есть главным образом три операции, которые мы должны выполнить:
Перед загрузкой индекса Elasticsearch с текстом и получением результатов поиска, Elasticsearch должен знать некоторые детали о вашем содержимом и то,как следует рассматривать данные. Таким образом, мы создаем индекс ES, который состоит из параметров и отображений. Отображения в ES являются эквивалентом моделей Django — поля данных определяются для вашего содержимого.
Хотя отображения совершенно необязательны, так как Elasticsearch динамически создает отображение для информации, которую он получил для индексации, но рекомендуется заранее определить отображение данных для индексирования.
Примером Python для создания индекса ES является следующий код:
data = {
"settings": {
"number_of_shards" : 4,
"number_of_replicas": 1
},
"mappings": {
"contacts" : {
"properties" : {
"name": { "type": "string" },
"email": { "type": "string" },
"mobile": { "type": "string" }},
"_source": {
"enabled": "true"
}
}
}
}
}
import json, requests
response = requests.put('http://127.0.0.1:9200/contacts/', data=json.
dumps(data))
print response.text
Вывод приведенного выше кода показан на следующем скриншоте:
После того, как мы создали наш первый индекс Elasticsearch, мы создали в JSON словарь с информацией и поместили дамп этой информации в Elasticsearch через запросы Python. Параметр "contacts" — это имя индекса, которое мы выбрали, и мы будем использовать это имя для накопления и извлечения данных от сервера Elasticsearch. Ключ "mappings" описывает, какие данные ваш индекс будет содержать. Мы можем иметь столько различные отображений, сколько хотим. Каждое отображение содержит поле, в котором хранятся данные, точно так же, как модели в Django. Некоторыми из основных полей являются строка, число, данные, Boolean и так далее. Полный список приводится в документации Elasticsearch. Параметры "shards" и "replicas" разъясняются в глоссарии ES. Без ключа "settings", ES будет просто использовать значения по умолчанию — в большинстве случаев это идеально подходит.
Теперь, когда вы создали индекс, давайте сохраним содержимое внутри него. Пример кода Python для воображаемой модели BlogPost, которая содержит заголовок, описание и содержание как текстовые поля является следующим:
import json, requests
data = json.dumps (
{"name": "SERGEY KOBZEV",
"email": "tilllindemann85@outlook.com",
"mobile": "8892572775"})
response = requests.put(‘ http://127.0.0.1:9200/contacts/contact/1’, data=data)
print response.text
Давайте взглянем на следующий скриншот:
Это показывает, что наши контактные данные были проиндексированы. Конечно в индексации данных и поиска не так много смысла, поэтому мы проиндексируем больше контактов, прежде чем мы сделаем запрос поиска.
Elasticsearch также предоставляет основную индексацию, которая может быть использована следующим образом:
import json, requests
contacts = [
{"name": "Rahul Kumar",
"email": "rahul@gmail.com",
"mobile": "1234567890"},
{"name": "Sanjeev Jaiswal",
"email": "jassics@gmail.com"
"mobile" : : "1122334455"},
{"name": "Raj" ,
"email": "raj ©gmai1.com",
"mobile": : "0071122334"},
{"name": "Shamitabh",
"email": "shabth@gmail.com",
"mobile": : "9988776655"}
for idx, contact in enumerate(contacts): data += '{"index": {"_id": "%s"}}\n' % idx data += json.dumps({
"name": contact["name"],
"email": contact["email"],
"mobile": contact ["mobile"]
})+'\n'
Как вы можете видеть на предыдущем снимке экрана, параметр "status": 201, который в статусе HTTP означает, что запись успешно создана. Elasticsearch считывает данные построчно, поэтому мы использовали "\n" в конце каждого набора данных. Массовые операции гораздо быстрее, чем выполнение несколько раз одного запроса.
Этот пример представляет собой простой пример JSON. Когда мы используем Elasticsearch с нашим приложением Django, один и тот же объект JSON может быть заменен моделью Django и индексировав модель, вы можете получить все объекты модели Django от запроса ModelName.objects.all(), а затем распарсить и сохранить его. Кроме того, в случае ручного идентификатора, как мы использовали в предыдущем примере, которым является индекс счетчика, будет гораздо удобнее, если вы используете первичный ключ для индексации его в качестве идентификатора Elasticsearch. Это поможет нам непосредственно запросить результат объекта, если мы не передаем информацию объекта как полезные данные.
Поиск индекса - довольно просто. Опять же, мы используем Python запросы, чтобы отправить закодированную JSON-строку с данными в нашу конечную точку ES:
data = {
"query" : {
"query_string": { "query": "raj" }
}
}
response = requests.post(
‘http://127.0.0.1:9200/contacts/contact/_search’,data=json.dumps(data))
print response.json()
Это даст результат, показанный на следующей картинке:
В этом примере мы ищем термин "raj" в нашем индексе контактов. ES возвращает все попадания, сортированные по релевантности в JSON-формате. Каждое из этих попаданий содержит поле "_id", что дает вам первичный ключ соответствующей записи блога. С использованием Django ORM, теперь просто получить фактические объекты из базы данных.
Конечный поиск ES предлагает неограниченный набор вариантов и фильтров; быстрый поиск из огромных наборов данных, разбиение на страницы и все, что вам нужно для построения мощного поискового движка.
Это только верхушка айсберга. При построении приложения Django с Elasticsearch, вы узнаете много интересных особенностей, таких как агрегации, который могут быть использованы в предшествующем примере.
В этой лекции, мы узнали о двух важных компонентах, которые чаще всего используются в проектах Django, а именно, AngularJS и Elasticsearch.
Как базовый интерфейс, AngularJS не только снижает нагрузку с сервера, нажав логика визуализации в браузере, он также дает богатый опыт для пользователя при использовании AngularJS-powered приложения.
Elasticsearch, с другой стороны, является одним из наиболее популярных поисковых движков, который является также open source. Простота создания и масштабирования Elasticsearch является тем, что заставляет выбрать его, основываясь на любых требованиях к поисковым движкам. Вы так же немного узнали о Django. Когда начался курс, мы были уверены, что вам нужна помощь в изучении и вы станете экспертами в этой области. Это только начало; столько всего нужно еще изучить, чтобы стать экспертом в том, что описывалось в каждой главе. Мы подошли к концу курса. В этом курсе мы прошли процесс создания микроблогового приложений с нуля, с использованием Django в качестве основы. Мы охватили множество вопросов, связанных с Веб 2.0 и социальными приложениями, а также многие компоненты Django. Вы всегда можете обратиться к документации Django. Если вы хотите узнать больше о определенной функции или компоненте, посетите https://docs.djangoproject.com.
Совсем недавно вышел в свет Django 1.9. Из основных особенностей, появившихся в данной версии, можно отметить следующее:
Контрольные вопросы
Упражнения
Упражнение 1.
Найдите в глоссарии ES определения параметров "shards" и "replicas"
Упражнение 2.
Внедрите полнотекстовый поиск в проект Django на рабочем сервере и убедитесь в его работоспособности
Упражнение 3.
Доработайте пример использования AngularJS, приведенный в лекции с тем, чтобы выдавалось имя пользователя, создавшего твит
Упражнение 4.
Постройте индекс для проекта приложения для твитов, созданного в данном курсе
Список тем рефератов
Краткие итоги
Цель лекции: Рассмотреть инструмент для организации полнотекстового поиска ElasticSearch; ознакомиться с AngularJS; рассмотреть простейший пример использования AngularJS в проекте Django; создать пример индекса для полнотекстового поиска.
Ключевые термины: Django, REST, ElasticSearch, AngularJS, поиск, индекс, веб, тег, модель, данные, html, запрос, конфигурация, сервер, API
Веб - разработка эволюционировала со временем, и пользователи потребляют информацию на таком большом количестве устройств. Веб изначально был адаптирован для устройств с большим экраном, но последние тенденции показывают, что потребление устройств с небольшим размером экрана которые можно держать в руке, увеличивается. Таким образом, растет необходимость предоставлять Веб для устройств с маленьким экраном, но эти устройства очень чувствительны в плане энергии. Таким образом существует необходимость отделить оболочку программы от внутреннего интерфейса в Django.
Однo из таких наиболее широко используемых решений заключается в использовании внутреннего интерфейса Django с помощью API, позволяющем в оболочке программы использовать его с Django. Использование AngularJS для такой ситуации является наиболее оптимальным.
REST стал будущим веб разработки и REST API - больше чем целая часть современного Веб. С увеличением фрагментации среди устройств, появляется необходимость единой минимальной конечной точки, которая не выполняет никакой операции представления. Для экземпляра, получение информации или связь может быть настолько быстрой, насколько это возможно, и может быть также масштабирована, и представление или бизнес-логика для этого остается за современными браузерами, использующими для этого фреймворк оболочки программы.
AngularJS — это современный JavaScript фреймворк, который используется для создания сложных веб-приложений в браузере.
С момента рождения AngularJS в 2009 году он развивается очень быстро и широко признан как основной рабочий фреймворк оболочки программы. В настоящее время он поддерживается Google.
AngularJS имеет очень интересную историю рождения. Он получил свое большое внимание, когда один из создателей Angular создал заново веб-приложение за 3 недели, которое изначально собрался разработать за 6 месяцев, уменьшив количество строк кода от 17000 до 1000.
Многие возможности AngularJS стоят над обычными фреймворками для веб-разработки. Среди них, несколько уникальных и инновационных возможностей, вроде двухсторонней привязки, внедрения зависимостей, легкого тестирования кода и расширение диалекта HTML с помощью директив.
На стороне сервера мы можем использовать Django REST framework или Tastypie для остальных конечных точек. Затем мы можем использовать AngularJS, который сконцентрирован на модели MVC, чтобы поощрять создание легко поддерживаемых модулей.
Веб-технологии эволюционировали от синхронных к асинхронных, то есть запросы веб-сайта теперь сильно используют асинхронные вызовы для обновления его содержимого без перезагрузки страницы, примером которого является ваша стена записей Facebook.
AngularJS является одним из решений ,когда требуется лучший способ асинхронной веб-разработки Django.
В следующем примере мы будем использовать AngularJS для создания одной страницы, которая использует API твитов, который мы уже создали.
Мы будем использовать AngulaJS, чтобы представить список всех твитов, но прежде, нам нужно познакомиться с ключевыми терминами AngularJS:
Когда мы проектируем веб-приложение на основе API, существует высокая вероятность того, что оба (внутренний интерфейс API и оболочка веб-приложения) из них находятся на разных серверах. Таким образом воз-никает необходимость настроить Django для совместного использование ресурсов между разными источниками (Cross-origin resource sharing, CORS).
Из определения, объясняемого в Википедии:
Cross-origin resource sharing (CORS, "совместное использование ресурсов между разными источниками") — технология современных браузеров, которая позволяет предоставить веб-странице доступ к ресурсам другого домена
Нам нужно изменить наше Django API, чтобы разрешить запросы от других серверов .Теперь мы обновим файл api.py приложения tweets, чтобы разрешить the requests для межсайтового запроса сервера:
class CORSResource(object):
"""
Adds CORS headers to resources that subclass this.
"""
def create_response(self, *args, **kwargs):
response = super(CORSResource, self).create_response(*args, **kwargs)
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Headers'] = 'Content-Type'
return response
def method_check(self, request, allowed=None):
if allowed is None:
allowed = []
request_method = request.method.lower()
allows = ','.join(map(unicode.upper, allowed))
if request_method == 'options':
response = HttpResponse(allows)
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Headers'] = 'Content-Type'
response['Allow'] = allows
raise ImmediateHttpResponse(response=response)
if not request_method in allowed:
response = http.HttpMethodNotAllowed(allows)
response['Allow'] = allows
raise ImmediateHttpResponse(response=response)
return request_method
После добавления этого класса, мы можем создать подкласс любого ресурса, который мы хотим подвергнуть для междудоменных запросов. Теперь мы изменим наш класс Tweet, чтобы сделать его доступным для межсайтового доступа:
Давайте обновим класс Tweet в соответствие со следуюшим:
class TweetResource(CORSResource, ModelResource):
class Meta:
queryset = Tweet.objects.all ()
resource_name = 'tweet'
Теперь ресурс tweet готов для доступа из разных доменов.
Ниже приведен простой пример AngularJS:
Создайте html-файл под названием app.html (так как этот файл независим от нашего существующего проекта Django, мы можем создать его вне папки проекта) со следующим содержимым. Сейчас эта страница использует AngularJS с локального диска, вы можете также импортировать страницу из CDN:
<html ng-app = "tweets" >
<head>
<title>Tweets App</title>
"script src="angular.min.js"></script>
</head>
<body>
<div ng-controller="tweetController">
<table>
<tr ng-repeat="tweet in tweets">
<td>{{ tweet.country }}</td>
<td>{{ tweet.text }}</td>
</tr >
</table>
</div>
<script src="app.js"></script>
</body>
</html>
В следующем коде, директива ng-controller срабатывает во время отображения, который обрабатывает любую бизнес-логику и внедряет вычисляемые модели внутрь области. Тег <div ng-controller="tweetController"> - один из примеров, где параметр tweetController обрабатывается перед отображением div.
Полностью наша бизнес-логика описывается на Javascript в файле app.js:
var app = angular.module('tweets', []);
app.controller("tweetController", function($scope,$http) {
$http({ headers: {'Content-Type': 'application/json;
charset=utf-8'}, method: 'GET',
url: "http://127.0.0.1:8000/api/vl/tweet/?format=json"
})
.success(function (data) {
$scope.tweets = data.objects;
})
}>;
Этот файл app.js делает запрос к конечному API твитов и внедряет объект tweet в область, которая отображается AngularJS в представлении (app.html) с директивой цикла ng-repeat:
<tr ng-repeat="tweet in tweets"></tr>
<td>{{tweet.country}}</td>
<td>{{tweet.text}}</td>
</tr>
Это всего лишь базовое приложение AngularJS, тогда как продвинутая веб-разработка полностью переместилась из разработки внутреннего интерфейса к разработке оболочки. Приложения на основе AngularJS идеально подходит для полного одностраничного приложения.
Поиск стал неотъемлемой частью большинства приложений, с которыми мы имеем дело сегодня. От Facebook для поиска друга, до Google, где вы ищете по всему Вебу, все от блога до журнала требует возможностей поиска для разблокировки скрытой информации на веб-сайте.
Веб развивается с экспоненциальной скоростью. Мерить данные гигабайтами теперь уже устарело и сотни терабайт структурированных и неструктурированных данных генерируется каждый день.
Elasticsearch (ES) лучше, чем другие альтернативы, потому что, помимо полнотекстового поиска, он обеспечивает полноценную аналитику данных в реальном времени и масштабируемость, с мощной поддержкой инфраструктуры данных кластеров.
Elasticsearch (ES) также дает вам простой REST API, который можно легко интегрировать с любым пользовательским приложением и окружение разработки Django (в более широком смысле, Python) дает много крутых, из коробки, инструментов для имплементации Elasticsearch (ES).
Веб-сайт ) содержит подробную документацию и там есть много замечательных онлайн-примеров, которые помогут вам построить любые виды поиска, которые вам нужны. Путем полного использования Elasticsearch, вы, вероятно, сможете построить свой собственный "Google" с его помощью.
Во-первых, установите Java. Затем скачайте и распакуйте Elasticsearch. Вы можете либо запустить ES как службу или вы можете стартовать ES сервер, используя следующие команды оболочки (измените пути в соответствии с вашей системой):
Set JAVA_HOME = \absolute\path\to\Java \absolute\path\to\ES\bin\elasticsearch
Если все сделано правильно, можно набрать следующий URL-адрес в вашем браузере:
Это даст вам ответ следующим образом, но с различным параметром build_hash:
{
"status" : 200,
"name" : "MN-E (Ultraverse)",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.4.1",
"build_hash" : "89d3241d670db65f994242c8e8383bl69779e2d4",
"build_timestamp" : "2014-11-26T15:49:29Z",
"build_snapshot" : false,
"lucene_version" : "4.10.2"
},
"tagline" : "Вы знаете, это все для поиска"
}
Elasticsearch поставляется с базовой конфигурации для базового развертывания. Однако если вы хотите настроить конфигурацию, обратитесь к онлайн документации и измените конфигурацию Elasticsearch в файле elasticsearch.yml.
Django может быть интегрирован с Elasticsearch с помощью базового программирования Python. В этом примере мы будем использовать библиотеку запросов Python для того, чтобы сделать запрос от Django к Elasticsearch. Мы можем установить запросы, введя следующий код:
pip install requests
Для функции поиска, есть главным образом три операции, которые мы должны выполнить:
Перед загрузкой индекса Elasticsearch с текстом и получением результатов поиска, Elasticsearch должен знать некоторые детали о вашем содержимом и то,как следует рассматривать данные. Таким образом, мы создаем индекс ES, который состоит из параметров и отображений. Отображения в ES являются эквивалентом моделей Django — поля данных определяются для вашего содержимого.
Хотя отображения совершенно необязательны, так как Elasticsearch динамически создает отображение для информации, которую он получил для индексации, но рекомендуется заранее определить отображение данных для индексирования.
Примером Python для создания индекса ES является следующий код:
data = {
"settings": {
"number_of_shards" : 4,
"number_of_replicas": 1
},
"mappings": {
"contacts" : {
"properties" : {
"name": { "type": "string" },
"email": { "type": "string" },
"mobile": { "type": "string" }},
"_source": {
"enabled": "true"
}
}
}
}
}
import json, requests
response = requests.put('http://127.0.0.1:9200/contacts/', data=json.
dumps(data))
print response.text
Вывод приведенного выше кода показан на следующем скриншоте:
После того, как мы создали наш первый индекс Elasticsearch, мы создали в JSON словарь с информацией и поместили дамп этой информации в Elasticsearch через запросы Python. Параметр "contacts" — это имя индекса, которое мы выбрали, и мы будем использовать это имя для накопления и извлечения данных от сервера Elasticsearch. Ключ "mappings" описывает, какие данные ваш индекс будет содержать. Мы можем иметь столько различные отображений, сколько хотим. Каждое отображение содержит поле, в котором хранятся данные, точно так же, как модели в Django. Некоторыми из основных полей являются строка, число, данные, Boolean и так далее. Полный список приводится в документации Elasticsearch. Параметры "shards" и "replicas" разъясняются в глоссарии ES. Без ключа "settings", ES будет просто использовать значения по умолчанию — в большинстве случаев это идеально подходит.
Теперь, когда вы создали индекс, давайте сохраним содержимое внутри него. Пример кода Python для воображаемой модели BlogPost, которая содержит заголовок, описание и содержание как текстовые поля является следующим:
import json, requests
data = json.dumps (
{"name": "SERGEY KOBZEV",
"email": "tilllindemann85@outlook.com",
"mobile": "8892572775"})
response = requests.put(‘ http://127.0.0.1:9200/contacts/contact/1’, data=data)
print response.text
Давайте взглянем на следующий скриншот:
Это показывает, что наши контактные данные были проиндексированы. Конечно в индексации данных и поиска не так много смысла, поэтому мы проиндексируем больше контактов, прежде чем мы сделаем запрос поиска.
Elasticsearch также предоставляет основную индексацию, которая может быть использована следующим образом:
import json, requests
contacts = [
{"name": "Rahul Kumar",
"email": "rahul@gmail.com",
"mobile": "1234567890"},
{"name": "Sanjeev Jaiswal",
"email": "jassics@gmail.com"
"mobile" : : "1122334455"},
{"name": "Raj" ,
"email": "raj ©gmai1.com",
"mobile": : "0071122334"},
{"name": "Shamitabh",
"email": "shabth@gmail.com",
"mobile": : "9988776655"}
for idx, contact in enumerate(contacts): data += '{"index": {"_id": "%s"}}\n' % idx data += json.dumps({
"name": contact["name"],
"email": contact["email"],
"mobile": contact ["mobile"]
})+'\n'
Как вы можете видеть на предыдущем снимке экрана, параметр "status": 201, который в статусе HTTP означает, что запись успешно создана. Elasticsearch считывает данные построчно, поэтому мы использовали "\n" в конце каждого набора данных. Массовые операции гораздо быстрее, чем выполнение несколько раз одного запроса.
Этот пример представляет собой простой пример JSON. Когда мы используем Elasticsearch с нашим приложением Django, один и тот же объект JSON может быть заменен моделью Django и индексировав модель, вы можете получить все объекты модели Django от запроса ModelName.objects.all(), а затем распарсить и сохранить его. Кроме того, в случае ручного идентификатора, как мы использовали в предыдущем примере, которым является индекс счетчика, будет гораздо удобнее, если вы используете первичный ключ для индексации его в качестве идентификатора Elasticsearch. Это поможет нам непосредственно запросить результат объекта, если мы не передаем информацию объекта как полезные данные.
Поиск индекса - довольно просто. Опять же, мы используем Python запросы, чтобы отправить закодированную JSON-строку с данными в нашу конечную точку ES:
data = {
"query" : {
"query_string": { "query": "raj" }
}
}
response = requests.post(
‘http://127.0.0.1:9200/contacts/contact/_search’,data=json.dumps(data))
print response.json()
Это даст результат, показанный на следующей картинке:
В этом примере мы ищем термин "raj" в нашем индексе контактов. ES возвращает все попадания, сортированные по релевантности в JSON-формате. Каждое из этих попаданий содержит поле "_id", что дает вам первичный ключ соответствующей записи блога. С использованием Django ORM, теперь просто получить фактические объекты из базы данных.
Конечный поиск ES предлагает неограниченный набор вариантов и фильтров; быстрый поиск из огромных наборов данных, разбиение на страницы и все, что вам нужно для построения мощного поискового движка.
Это только верхушка айсберга. При построении приложения Django с Elasticsearch, вы узнаете много интересных особенностей, таких как агрегации, который могут быть использованы в предшествующем примере.
В этой лекции, мы узнали о двух важных компонентах, которые чаще всего используются в проектах Django, а именно, AngularJS и Elasticsearch.
Как базовый интерфейс, AngularJS не только снижает нагрузку с сервера, нажав логика визуализации в браузере, он также дает богатый опыт для пользователя при использовании AngularJS-powered приложения.
Elasticsearch, с другой стороны, является одним из наиболее популярных поисковых движков, который является также open source. Простота создания и масштабирования Elasticsearch является тем, что заставляет выбрать его, основываясь на любых требованиях к поисковым движкам. Вы так же немного узнали о Django. Когда начался курс, мы были уверены, что вам нужна помощь в изучении и вы станете экспертами в этой области. Это только начало; столько всего нужно еще изучить, чтобы стать экспертом в том, что описывалось в каждой главе. Мы подошли к концу курса. В этом курсе мы прошли процесс создания микроблогового приложений с нуля, с использованием Django в качестве основы. Мы охватили множество вопросов, связанных с Веб 2.0 и социальными приложениями, а также многие компоненты Django. Вы всегда можете обратиться к документации Django. Если вы хотите узнать больше о определенной функции или компоненте, посетите https://docs.djangoproject.com.
Совсем недавно вышел в свет Django 1.9. Из основных особенностей, появившихся в данной версии, можно отметить следующее:
Контрольные вопросы
Упражнения
Упражнение 1.
Найдите в глоссарии ES определения параметров "shards" и "replicas"
Упражнение 2.
Внедрите полнотекстовый поиск в проект Django на рабочем сервере и убедитесь в его работоспособности
Упражнение 3.
Доработайте пример использования AngularJS, приведенный в лекции с тем, чтобы выдавалось имя пользователя, создавшего твит
Упражнение 4.
Постройте индекс для проекта приложения для твитов, созданного в данном курсе
Список тем рефератов
Краткие итоги
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.