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

4,569 views

Published on

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

  1. 1. О докладчикеДмитрий Голушко Java разработчик, server-side
  2. 2. Важные параметры:Скорость индексирования(в том числе realtime)Способы взаимодействия(API, REST, etc.)Работа с языками, стемминг, нечеткие запросыДополнительные типы полей вдокументах(numeric, geo, source, etc.)Платформа и языкВстроенные механизмы ранжирования и сортировки
  3. 3. Какие есть варианты?Elasticsearch(based on Lucene, Java)Solr(based on Lucene, Java)Sphinx search engine(C++)Xapian(C++)
  4. 4. Почему мы выбрали Elasticsearch?Отличная поддержка шардинга и репликации на лету
  5. 5. Шардинг и репликация. Создаем индекс.Нода 1 Street1 { Street2 “number_of_shards” : 2, “number_of_replicas” : 1 }
  6. 6. Шардинг и репликация. Добавляем еще одну ноду.Нода 1 Нода 2 Репликация Street1 Street1 Street2 Street2
  7. 7. Шардинг и репликация. Добавляем еще 2 ноды.Нода 1 Нода 2 Нода 3 Нода 4 Street1 Street1 Street2 Street2
  8. 8. Почему мы выбрали Elasticsearch?Отличная поддержка шардинга и репликации на летуНаписан на Java и базируется на известном движкеLuceneNear-realtime индексация.
  9. 9. Поиск по «свежему» индексу
  10. 10. Поиск по индексу, содновременной индексацией
  11. 11. Поиск по большому индексу, содновременной индексацией
  12. 12. Почему мы выбрали Elasticsearch?Отличная поддержка шардинга и репликации на летуНаписан на Java и базируется на известном движкеLuceneNear-realtime индексация. Есть всё что нам нужноOpensource, ASL v2Имеется возможность для расширения
  13. 13. Возможность для расширенияRiver-плагины(поток данных из другого источника) CouchDB RabbitMQ MongoDB …Анализаторы Русская морфология Hunspell(орфография)Transport(расширения протоколов взаимодействия) Memcached ZeroMQ Servlet …Site Plugins(чаще всего UI для управления кластером)Scripting Plugins(ЯП для скриптов)
  14. 14. ElasticSearch Paramedic
  15. 15. BigDesk
  16. 16. elasticsearch-head
  17. 17. Особенности ElasticsearchДокументно-ориентированныйSchema-freeJSON как основной способ работы с данными
  18. 18. 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} }] }}
  19. 19. Особенности ElasticsearchДокументно-ориентированныйSchema-freeJSON как основной способ работы с даннымиРаспределенный поиск
  20. 20. Распределенный поискNode Node NodeNode Node Node Приложение
  21. 21. Распределенный поискNode Node NodeNode Node Node Приложение
  22. 22. Особенности ElasticsearchДокументно-ориентированныйSchema-freeJSON как основной способ работы с даннымиРаспределенный поискСкрипты для фильтрации(о них чуть позже)Обновление настроек «на лету»
  23. 23. Обновление настроек «на лету»POST “http://localhost:9200/index_name/_settings”"{ "index" : { "number_of_replicas" : 3 }}
  24. 24. Обновление настроек на летуНода 1 Нода 2 Нода 3 Нода 4 Street1 Street1 Street1 Street1 Street2 Street2 Street2 Street2
  25. 25. Индексация Анализатор Token FilterTokenizer Token Filter Token Filter Token Filter
  26. 26. Token FiltersСтеммеры(Стеммер Портера) важно важн важного важн важное важн важной важн важном важн важному важнФонетические(Soundex, Metaphone, etc.)Ngramm
  27. 27. 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
  28. 28. Ngramm
  29. 29. Запросы«Обычные» запросыTerm MatchNot match Prefix Bool Wildcard RangeГеографические запросыBoosting запросыSpan запросыНечеткие запросы
  30. 30. Fuzzy запросы(нечеткие)Расстояние Левенштейна - минимальное количество операций вставки одного символа, удаления одного символа и замены одного символа на другой, необходимых для превращения одной строки в другую. Жукава 1 Жукова Лизной (проезд) 2 Лесной (проезд) Бухольца 1 Бухгольца
  31. 31. Это важно!В большинстве случаев вы должны использовать для поиска тот же алгоритм анализа, что и при индексировании! Fuzzy Query Soundex «жукава» «a500» Fuzzy Query 3gramm «жукава» «жук ука кав ава»
  32. 32. ФильтрацияОбычные фильтрыTerm Prefix Range MissingExists QueryГеофильтрыScript фильтр
  33. 33. Геофильтры 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]] } } } }}
  34. 34. Геофильтры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} } } }
  35. 35. ГеофильтрыGeo BBox Geo distance Geo distance range Geo polygon Geo shape
  36. 36. ГеофильтрыGeo BBox Geo distance Geo distance range Geo polygon Geo shape "filter" : { "geo_distance" : { "distance" : "2km", "pin.location" : { "lat" : 40, "lon" : -70 } } }
  37. 37. ГеофильтрыGeo BBox Geo distance Geo distance range Geo polygon Geo shape
  38. 38. Геофильтры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" } } }
  39. 39. Скрипт-фильтр"filtered" : { "query" : { ... }, "filter" : { "script" : { "script" : "doc[num1].value > 1" } }}
  40. 40. Скрипт-фильтр. Доступные языки Java JavaScript Groovy Python
  41. 41. Advanced featuresПодсветка(Highlighting)Именованные фильтры(Named Filters)Attachment indexing(с помощью Apache Tika)Microsoft Office, Open Document Formats, ePub, PDF, etc.Time-to-live fieldsPercolationFacets
  42. 42. Percolation Индексируются запросы, а не документы! Тем не менее это обычный индекс Запросы распространяются на все репликиПоддерживают все обычные запросы и фильтры
  43. 43. PercolationPOST “http://localhost:9200/_percolator/messages/kgb” { "query" : { "terms" : { "message" : ["путин","навальный", "террорист","бомба", "наркотики","взятка"] } } }
  44. 44. Здарова! Зацени чо творится"doc" : { «Одесский террорист, "метивший "message" : "..." в Путина", заявил о милицейских пытках } наркотиками и пакетами». GET “http://localhost:9200/messages/type/_percolate” {"ok":true, "matches":["kgb"]}
  45. 45. Facets Агрегированная информация по запросу Статистическая информация Сумма, минимальноемаксимальное значение, среднее и т.д.Гистограммы(включая гистрограмму по дате) Географический facet
  46. 46. Географический facet { "facets" : { "geo1" : { "geo_distance" : { "pin.location" : {"lat" : 40, "lon" : -70 }, "ranges" : [ { "to" : 10 }, { "from" : 10, "to" : 20 }, { "from" : 20, "to" : 100 }, { "from" : 100 } ] } } } }
  47. 47. А теперь небольшой real-world пример!
  48. 48. Развлечения!
  49. 49. { "query" : { "match_all" : {} }, "facets" : { "facet_search" : { "terms" : { "quick_address_type" : ["restaurant", "cafe", "sauna", "pool", "bowling","bar"] } } }}
  50. 50. "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 } ] }}
  51. 51. Рестораны(7)Кафе(5)Сауны(6)Бильярды(3)Боулинги(2)Бары(7)
  52. 52. { "query" : { "term" : {"quick_address_type" : "restaurant"} }, "sort" : [ { "_geo_distance" : { "pin.location" : [-73.13, 55.01], "order" : "asc", "unit" : "km" } }, { "rating" : { "user_rating" : "desc" } } ]}
  53. 53. «Беляшкино» 1км.«Пампуши» 2км.«Фуаграшная» 0,5км.
  54. 54. КОНЕЦ!

×