2012-10-02 12 views
6

Początkowo próbowałem opublikować podobny post na liście mailingowej elasticsearch (https://groups.google.com/forum/?fromgroups=#!topic/elasticsearch/BZLFJSEpl78), ale nie otrzymałem żadnych pomocnych odpowiedzi, więc mimo to spróbowałem wypróbować Stack Overflow. To jest mój pierwszy wpis na SO, więc przepraszam, jeśli nie pasuje on do formy, do której ma służyć.Dostosowywanie algorytmu wyszukiwania w Elasticsearch

Obecnie pracuję z uniwersytetu pomagając im realizować zestaw testowy do dalszego udoskonalania rozeznanie zostali prowadzącego. Ich badania opierają się na dynamicznym wyszukiwaniu schematów. Po spędzeniu trochę czasu na ocenie różnych rozwiązań z zakresu wyszukiwania open source zdecydowałem się na elastyczne wyszukiwanie jako platformę podstawową i zastanawiam się, jaki byłby najlepszy sposób postępowania. Spędziłem około tygodnia analizując dokumentację elasticsearch i sam kod, a także czytając dokumentację Lucene, ale walczę o wyraźną przyszłość.

Celem projektu jest dostarczenie badaczom oprogramowania, z którego mogą skorzystać, aby wypróbować rewizje algorytmu wyszukiwania w celu przetestowania i udoskonalenia. Chcieliby móc napisać algorytm wtykowy w językach innych niż Java obsługiwanych przez JVM, takich jak Groovy, Python lub Closure, ale nie jest to trudne. Częścią tego będzie zapewnienie front-endu do uruchamiania zapytań i wyświetlania danych wyjściowych oraz interfejsu administratora do dodawania dokumentów do indeksu. Czuję się z tym dobrze dzięki bardzo potężnemu i kompletnemu API REST. Nie jestem do końca pewien, jak postępować w implementowaniu algorytmu wyszukiwania wtyczkowego.

algorytm badacza wymaga 4 wejść do funkcji:

  1. Określenia grupa (a) zapytania.
  2. Słowo (pojęcie) x Macierz dokumentu w indeksie.
  3. Dokument x Macierz wyrazów (term) w indeksie.
  4. Lista częstotliwości słów (terminów) w indeksie. Tak wiele razy każde słowo pojawia się w całym indeksie.

Dla ich celów dokument nie odpowiada rzeczywistemu dokumentowi rzeczywistemu (w rzeczywistości nazywają je zdarzeniami tekstowymi). Raczej na razie odpowiada jednemu zdaniu (o tym, że konfigurowalny może być również użyteczny). Uważam, że najlepszym sposobem na to jest podział dokumentów na ich zdania (za pomocą Apache Tika lub coś podobnego), umieszczając każde zdanie jako swój własny dokument w indeksie. Jestem przekonany, że mogę to zrobić w interfejsie administratora, który udostępniam przy użyciu dodatku mapper-attachement jako punktu wyjścia. Wadą jest to, że dzielenie dokumentu przed poddaniem go elastycznym poszukiwaniom nie jest bardzo konfigurowalnym sposobem robienia tego. Jeśli chcą zmienić rozdzielczość na ich algorytm, będą musieli ponownie dodać wszystkie dokumenty do indeksu. Jeśli indeks przechowywał pełne dokumenty w takiej postaci, w jakiej algorytm wyszukiwania mógłby wybrać rozdzielczość dla każdego zapytania, byłoby to idealne. Nie jestem pewien, czy to możliwe, czy nie.

Następnym problemem jest uzyskanie trzech wymaganych wejść i przekazanie ich do swojego algorytmu wyszukiwania. Naprawdę mam problem z tym, od czego zacząć. Wygląda na to, patrząc na Luecene, że muszę podać własną implementację wyszukiwania/zapytania, ale nie jestem pewien, czy to prawda, czy nie. Nie ma również żadnych wtyczek do wyszukiwania na stronie elasticsearch, więc nie jestem nawet pewien, czy jest to możliwe. Ważne jest to, że algorytm musi działać na poziomie indeksu z dostępnymi terminami zapytania, aby wygenerować swój schemat przed użyciem schematu do oceny każdego dokumentu w indeksie. Z tego, co wiem, oznacza to, że interfejs skryptowy udostępniany przez elastyczne wyszukiwanie nie będzie przydatny. Opis interfejsu skryptowego w przewodniku elasticsearch sprawia, że ​​brzmi on jak skrypt działający na poziomie dokumentu, a nie na poziomie indeksu.Inne obawy/rozważania to możliwość zaprogramowania tego algorytmu w różnych językach (podobnie jak interfejs skryptowy) i możliwość zwiększenia wartości zwracanej przez interfejs API REST w celu wyszukiwania w celu uwzględnienia schematu wygenerowanego algorytmu (który, jak zakładam, oznacza Będę musiał zdefiniować własne punkty końcowe REST).

Czy ktoś może mi doradzić, od czego zacząć? Wygląda na to, że będę musiał napisać własną wtyczkę do wyszukiwania, która będzie akceptować skrypty jako jej podstawowy algorytm. Wtyczka będzie odpowiedzialna za uporządkowanie 4 wejść, które opisałem wcześniej przed przekazaniem kontroli do skryptu. Będzie również odpowiedzialny za uzyskanie danych wyjściowych ze skryptu i zwrócenie go za pośrednictwem własnego interfejsu REST API. Czy to wydaje się logiczne? Jeśli tak, jak mam zacząć? Jakich części kodu potrzebuję, aby go obejrzeć?

Odpowiedz

0

Powinieneś przechowywać 1 zdanie na dokument, jeśli tak działa jego algorytm. Zawsze możesz ponownie sprawdzić, czy zmieniają swój model.

Lucene jest całkiem niezły w wyszukiwaniu meczów, więc podejrzewam, że algorytm współpracowników będzie zajmował się punktacją. ElasticSearch obsługuje niestandardowy skrypt scoringowy. Możesz przekazać parametry do danego skryptu punktacji. Możesz używać groovy do skryptowania w ES. http://www.elasticsearch.org/guide/reference/modules/scripting.html

Aby użyć większych datastructures w swoim algorytmie wyszukiwania, to nie ma sensu, aby przekazać te datastructures jako params, może się okazać, że warto korzystać z innych źródeł danych w skrypcie punktacji. Na przykład Redis: http://java.dzone.com/articles/connecting-redis-elasticsearch.

Powiązane problemy