2013-02-02 03 Голушко. Полнотекстовый поиск с elasticsearch

56

Upload: -

Post on 28-Nov-2014

2.985 views

Category:

Documents


11 download

DESCRIPTION

 

TRANSCRIPT

Page 1: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
Page 2: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Дмитрий Голушко

О докладчике

Java разработчик, server-side

Page 3: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Важные параметры:

Скорость индексирования(в том числе realtime)

Способы взаимодействия(API, REST, etc.)

Работа с языками, стемминг, нечеткие запросы

Дополнительные типы полей в документах(numeric, geo, source, etc.)

Платформа и язык

Встроенные механизмы ранжирования и сортировки

Page 4: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Какие есть варианты?

Elasticsearch(based on Lucene, Java)

Solr(based on Lucene, Java)

Sphinx search engine(C++)

Xapian(C++)

Page 5: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Почему мы выбрали Elasticsearch?

Отличная поддержка шардинга и репликации на лету

Page 6: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Шардинг и репликация. Создаем индекс.

Нода 1

Street1

Street2

{ “number_of_shards” : 2, “number_of_replicas” : 1 }

Page 7: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Шардинг и репликация. Добавляем еще одну ноду.

Нода 1 Нода 2

Street1 Street1

Street2 Street2

Репликация

Page 8: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Шардинг и репликация. Добавляем еще 2 ноды.

Нода 1 Нода 2

Street1

Street2

Нода 3 Нода 4

Street1

Street2

Page 9: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Почему мы выбрали Elasticsearch?

Написан на Java и базируется на известном движке Lucene

Отличная поддержка шардинга и репликации на лету

Near-realtime индексация.

Page 10: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Поиск по «свежему» индексу

Page 11: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Поиск по индексу, с одновременной индексацией

Page 12: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Поиск по большому индексу, с одновременной индексацией

Page 13: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Почему мы выбрали Elasticsearch?

Написан на Java и базируется на известном движке Lucene

Отличная поддержка шардинга и репликации на лету

Near-realtime индексация.

Есть всё что нам нужно

Имеется возможность для расширения

Opensource, ASL v2

Page 14: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Возможность для расширения

River-плагины(поток данных из другого источника)

CouchDB RabbitMQ MongoDB

Анализаторы

Русская морфология Hunspell(орфография)

… Transport(расширения протоколов взаимодействия)

Memcached ZeroMQ Servlet

Site Plugins(чаще всего UI для управления кластером)

Scripting Plugins(ЯП для скриптов)

Page 15: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

ElasticSearch Paramedic

Page 16: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

BigDesk

Page 17: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

elasticsearch-head

Page 18: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Особенности Elasticsearch

Документно-ориентированный

Schema-free

JSON как основной способ работы с данными

Page 19: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

JSON как основной способ работы с данными

GET “http://localhost:9200/index_name/streets/_search?q=Жукова”

{ "took" : 138, "timed_out" : false, "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 1.9674579, "hits" : [{ "_index" : “index_name", "_type" : "street", "_id" : "VLvO7h7bQUiCOlGwd2iJrA", "_score" : 1.9674579, "_source" : {"STREET_NAME":"Маршала Жукова", "CITY_NAME":"Омск", “STREET_ID” : 3} } ] } }

Затраченное время

Количество результатов

Исходный документ

Page 20: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Особенности Elasticsearch

Документно-ориентированный

Schema-free

JSON как основной способ работы с данными

Распределенный поиск

Page 21: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Распределенный поиск

Node Node Node

Node Node Node

Приложение

Page 22: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Распределенный поиск

Node Node Node

Node Node Node

Приложение

Page 23: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Особенности Elasticsearch

Документно-ориентированный

Schema-free

JSON как основной способ работы с данными

Распределенный поиск

Скрипты для фильтрации(о них чуть позже)

Обновление настроек «на лету»

Page 24: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Обновление настроек «на лету»

"{ "index" : { "number_of_replicas" : 3 } }

POST “http://localhost:9200/index_name/_settings”

Page 25: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Обновление настроек на лету

Нода 1 Нода 2

Street1

Street2

Нода 3 Нода 4

Street1

Street2 Street2 Street2

Street1 Street1

Page 26: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Индексация

Анализатор

Tokenizer

Token Filter

Token Filter

Token Filter

Token Filter

Page 27: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Token Filters

Фонетические(Soundex, Metaphone, etc.)

Стеммеры(Стеммер Портера)

Ngramm

важно важного важное важной важном важному

важн важн важн важн важн важн

Page 28: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Soundex • Первая буква сохраняется • В остальной части слова:

• Буквы, обозначающие, как правило, гласные звуки: a, e, h, i, o, u, w и y — отбрасываются • Оставшиеся буквы (согласные) заменяются на цифры от 1 до 6, причём похожим по звучанию буквам соответствуют одинаковые цифры:

• 1: b, f, p, v • 2: c, g, j, k, q, s, x, z • 3: d, t • 4: l • 5: m, n • 6: r

• Любая последовательность одинаковых цифр сокращается до одной такой цифры. • Итоговая строка обрезается до первых четырёх символов. Если длина строки меньше требуемой, недостающие символы заменяются знаком 0. Примеры: аmmonium → ammnm → a5555 → a5 → a500 implementation → implmnttn → i51455335 → i514535 → i514

Page 29: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Ngramm

Page 30: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Запросы

«Обычные» запросы Term Match\Not match Bool Prefix Wildcard Range

Нечеткие запросы

Географические запросы

Boosting запросы

Span запросы

Page 31: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Fuzzy запросы(нечеткие)

Расстояние Левенштейна - минимальное количество операций

вставки одного символа, удаления одного символа и замены одного символа на другой, необходимых для превращения одной строки в другую.

Жукава Жукова

Лизной (проезд) Лесной (проезд)

Бухольца Бухгольца

1

2

1

Page 32: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Это важно! В большинстве случаев вы должны использовать для поиска

тот же алгоритм анализа, что и при индексировании!

Fuzzy Query «жукава»

Soundex «a500»

3gramm «жук ука кав ава»

Fuzzy Query «жукава»

Page 33: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Фильтрация

Обычные фильтры

Геофильтры

Script фильтр

Term Prefix Range Missing\Exists Query

Page 34: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Геофильтры

Geo distance Geo distance range Geo polygon Geo shape Geo BBox

{ “address" : { "location" : { "lat" : 41.12, "lon" : -71.34 } } }

{ "location" : { "type" : "envelope", "coordinates" : [[-45.0, 45.0], [45.0, -45.0]] } }

Page 35: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Геофильтры

Geo distance Geo distance range Geo polygon Geo shape Geo BBox

"filter" : { "geo_bounding_box" : { "pin.location" : { "top_left" : {"lat" : 40.73, "lon" : -74.1 }, "bottom_right" : {"lat" : 40.717, "lon" : -73.99} } } }

Page 36: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Геофильтры

Geo distance Geo distance range Geo polygon Geo shape Geo BBox

Page 37: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Геофильтры

Geo distance Geo distance range Geo polygon Geo shape Geo BBox

"filter" : { "geo_distance" : { "distance" : "2km", "pin.location" : { "lat" : 40, "lon" : -70 } } }

Page 38: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Геофильтры

Geo distance Geo distance range Geo polygon Geo shape Geo BBox

Page 39: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Геофильтры

Geo distance Geo distance range Geo polygon Geo shape Geo BBox

"filter": { "geo_shape": { "location": { "indexed_shape": {"id": "Украина", "type": "countries", "index": "shapes", "shape_field_name": "shape" }, "relation": "within" } } }

Page 40: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Скрипт-фильтр

"filtered" : { "query" : { ... }, "filter" : { "script" : { "script" : "doc['num1'].value > 1" } } }

Page 41: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Скрипт-фильтр. Доступные языки

Java

Groovy

Python

JavaScript

Page 42: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Advanced features Подсветка(Highlighting)

Именованные фильтры(Named Filters)

Percolation

Facets

Attachment indexing(с помощью Apache Tika) Microsoft Office, Open Document Formats, ePub, PDF, etc.

Time-to-live fields

Page 43: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Percolation

Индексируются запросы, а не документы!

Тем не менее это обычный индекс

Запросы распространяются на все реплики

Поддерживают все обычные запросы и фильтры

Page 44: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Percolation

{ "query" : { "terms" : {

"message" : ["путин","навальный", "террорист","бомба", "наркотики","взятка"]

} } }

“http://localhost:9200/_percolator/messages/kgb” POST

Page 45: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

{"ok":true, "matches":["kgb"]}

Здарова! Зацени чо творится «Одесский террорист, "метивший в Путина", заявил о милицейских пытках наркотиками и пакетами».

"doc" : { "message" : "..." }

“http://localhost:9200/messages/type/_percolate” GET

Page 46: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Facets

Агрегированная информация по запросу

Статистическая информация Сумма, минимальное\максимальное значение, среднее и т.д.

Гистограммы(включая гистрограмму по дате)

Географический facet

Page 47: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Географический facet { "facets" : { "geo1" : { "geo_distance" : { "pin.location" : {"lat" : 40, "lon" : -70 }, "ranges" : [ { "to" : 10 }, { "from" : 10, "to" : 20 }, { "from" : 20, "to" : 100 }, { "from" : 100 } ] } } } }

Page 48: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
Page 49: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

А теперь небольшой real-world пример!

Page 50: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Развлечения!

Page 51: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

{ "query" : { "match_all" : {} }, "facets" : { "facet_search" : { "terms" : { "quick_address_type" : ["restaurant", "cafe", "sauna", "pool", "bowling","bar"] } } } }

Page 52: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

"facets" : { "tags" : { "_type" : "terms", "missing" : 0, "total": 30, "other": 0, "terms" : [ { "term" : "restaurant", "count" : 7 }, {"term" : "cafe", "count" : 5 }, {"term" : "sauna","count" : 6}, {"term" : "pool","count" : 3}, {"term" : "bowling","count" : 2}, {"term" : "bar","count" : 7 } ] } }

Page 53: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

Рестораны(7)

Кафе(5)

Сауны(6)

Боулинги(2)

Бильярды(3)

Бары(7)

Page 54: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

{ "query" : { "term" : {"quick_address_type" : "restaurant"} }, "sort" : [ { "_geo_distance" : { "pin.location" : [-73.13, 55.01], "order" : "asc", "unit" : "km" } }, { "rating" : { "user_rating" : "desc" } } ] }

Page 55: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

«Беляшкино» 1км.

«Пампуши» 2км.

«Фуаграшная» 0,5км.

Page 56: 2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch

КОНЕЦ!