2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 2,549 views

 

Statistics

Views

Total Views
2,549
Views on SlideShare
2,457
Embed Views
92

Actions

Likes
6
Downloads
21
Comments
0

5 Embeds 92

http://localhost 63
https://gitter.im 16
http://omskit.local 8
http://192.168.1.228 3
http://saturdays.omskit.org 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • О докладчикеДмитрий Голушко Java разработчик, server-side
    • Важные параметры:Скорость индексирования(в том числе realtime)Способы взаимодействия(API, REST, etc.)Работа с языками, стемминг, нечеткие запросыДополнительные типы полей вдокументах(numeric, geo, source, etc.)Платформа и языкВстроенные механизмы ранжирования и сортировки
    • Какие есть варианты?Elasticsearch(based on Lucene, Java)Solr(based on Lucene, Java)Sphinx search engine(C++)Xapian(C++)
    • Почему мы выбрали Elasticsearch?Отличная поддержка шардинга и репликации на лету
    • Шардинг и репликация. Создаем индекс.Нода 1 Street1 { Street2 “number_of_shards” : 2, “number_of_replicas” : 1 }
    • Шардинг и репликация. Добавляем еще одну ноду.Нода 1 Нода 2 Репликация Street1 Street1 Street2 Street2
    • Шардинг и репликация. Добавляем еще 2 ноды.Нода 1 Нода 2 Нода 3 Нода 4 Street1 Street1 Street2 Street2
    • Почему мы выбрали Elasticsearch?Отличная поддержка шардинга и репликации на летуНаписан на Java и базируется на известном движкеLuceneNear-realtime индексация.
    • Поиск по «свежему» индексу
    • Поиск по индексу, содновременной индексацией
    • Поиск по большому индексу, содновременной индексацией
    • Почему мы выбрали Elasticsearch?Отличная поддержка шардинга и репликации на летуНаписан на Java и базируется на известном движкеLuceneNear-realtime индексация. Есть всё что нам нужноOpensource, ASL v2Имеется возможность для расширения
    • Возможность для расширенияRiver-плагины(поток данных из другого источника) CouchDB RabbitMQ MongoDB …Анализаторы Русская морфология Hunspell(орфография)Transport(расширения протоколов взаимодействия) Memcached ZeroMQ Servlet …Site Plugins(чаще всего UI для управления кластером)Scripting Plugins(ЯП для скриптов)
    • ElasticSearch Paramedic
    • BigDesk
    • elasticsearch-head
    • Особенности ElasticsearchДокументно-ориентированныйSchema-freeJSON как основной способ работы с данными
    • 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} }] }}
    • Особенности ElasticsearchДокументно-ориентированныйSchema-freeJSON как основной способ работы с даннымиРаспределенный поиск
    • Распределенный поискNode Node NodeNode Node Node Приложение
    • Распределенный поискNode Node NodeNode Node Node Приложение
    • Особенности ElasticsearchДокументно-ориентированныйSchema-freeJSON как основной способ работы с даннымиРаспределенный поискСкрипты для фильтрации(о них чуть позже)Обновление настроек «на лету»
    • Обновление настроек «на лету»POST “http://localhost:9200/index_name/_settings”"{ "index" : { "number_of_replicas" : 3 }}
    • Обновление настроек на летуНода 1 Нода 2 Нода 3 Нода 4 Street1 Street1 Street1 Street1 Street2 Street2 Street2 Street2
    • Индексация Анализатор Token FilterTokenizer Token Filter Token Filter Token Filter
    • Token FiltersСтеммеры(Стеммер Портера) важно важн важного важн важное важн важной важн важном важн важному важнФонетические(Soundex, Metaphone, etc.)Ngramm
    • 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 → a500implementation → implmnttn → i51455335 → i514535 → i514
    • Ngramm
    • Запросы«Обычные» запросыTerm MatchNot match Prefix Bool Wildcard RangeГеографические запросыBoosting запросыSpan запросыНечеткие запросы
    • Fuzzy запросы(нечеткие)Расстояние Левенштейна - минимальное количество операций вставки одного символа, удаления одного символа и замены одного символа на другой, необходимых для превращения одной строки в другую. Жукава 1 Жукова Лизной (проезд) 2 Лесной (проезд) Бухольца 1 Бухгольца
    • Это важно!В большинстве случаев вы должны использовать для поиска тот же алгоритм анализа, что и при индексировании! Fuzzy Query Soundex «жукава» «a500» Fuzzy Query 3gramm «жукава» «жук ука кав ава»
    • ФильтрацияОбычные фильтрыTerm Prefix Range MissingExists QueryГеофильтрыScript фильтр
    • Геофильтры Geo BBox Geo distance Geo distance range Geo polygon Geo shape{ { “address" : { "location" : { "location" : { "type" : "envelope", "lat" : 41.12, "coordinates" : [[-45.0, 45.0], "lon" : -71.34 [45.0, -45.0]] } } } }}
    • ГеофильтрыGeo BBox Geo distance Geo distance range Geo polygon Geo shape "filter" : { "geo_bounding_box" : { "pin.location" : { "top_left" : {"lat" : 40.73, "lon" : -74.1 }, "bottom_right" : {"lat" : 40.717, "lon" : -73.99} } } }
    • ГеофильтрыGeo BBox Geo distance Geo distance range Geo polygon Geo shape
    • ГеофильтрыGeo BBox Geo distance Geo distance range Geo polygon Geo shape "filter" : { "geo_distance" : { "distance" : "2km", "pin.location" : { "lat" : 40, "lon" : -70 } } }
    • ГеофильтрыGeo BBox Geo distance Geo distance range Geo polygon Geo shape
    • ГеофильтрыGeo BBox Geo distance Geo distance range Geo polygon Geo shape "filter": { "geo_shape": { "location": { "indexed_shape": {"id": "Украина", "type": "countries", "index": "shapes", "shape_field_name": "shape" }, "relation": "within" } } }
    • Скрипт-фильтр"filtered" : { "query" : { ... }, "filter" : { "script" : { "script" : "doc[num1].value > 1" } }}
    • Скрипт-фильтр. Доступные языки Java JavaScript Groovy Python
    • Advanced featuresПодсветка(Highlighting)Именованные фильтры(Named Filters)Attachment indexing(с помощью Apache Tika)Microsoft Office, Open Document Formats, ePub, PDF, etc.Time-to-live fieldsPercolationFacets
    • Percolation Индексируются запросы, а не документы! Тем не менее это обычный индекс Запросы распространяются на все репликиПоддерживают все обычные запросы и фильтры
    • PercolationPOST “http://localhost:9200/_percolator/messages/kgb” { "query" : { "terms" : { "message" : ["путин","навальный", "террорист","бомба", "наркотики","взятка"] } } }
    • Здарова! Зацени чо творится"doc" : { «Одесский террорист, "метивший "message" : "..." в Путина", заявил о милицейских пытках } наркотиками и пакетами». GET “http://localhost:9200/messages/type/_percolate” {"ok":true, "matches":["kgb"]}
    • Facets Агрегированная информация по запросу Статистическая информация Сумма, минимальноемаксимальное значение, среднее и т.д.Гистограммы(включая гистрограмму по дате) Географический facet
    • Географический facet { "facets" : { "geo1" : { "geo_distance" : { "pin.location" : {"lat" : 40, "lon" : -70 }, "ranges" : [ { "to" : 10 }, { "from" : 10, "to" : 20 }, { "from" : 20, "to" : 100 }, { "from" : 100 } ] } } } }
    • А теперь небольшой real-world пример!
    • Развлечения!
    • { "query" : { "match_all" : {} }, "facets" : { "facet_search" : { "terms" : { "quick_address_type" : ["restaurant", "cafe", "sauna", "pool", "bowling","bar"] } } }}
    • "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 } ] }}
    • Рестораны(7)Кафе(5)Сауны(6)Бильярды(3)Боулинги(2)Бары(7)
    • { "query" : { "term" : {"quick_address_type" : "restaurant"} }, "sort" : [ { "_geo_distance" : { "pin.location" : [-73.13, 55.01], "order" : "asc", "unit" : "km" } }, { "rating" : { "user_rating" : "desc" } } ]}
    • «Беляшкино» 1км.«Пампуши» 2км.«Фуаграшная» 0,5км.
    • КОНЕЦ!