Mam kilka bardzo konkretnych pytań dotyczących Rails + Tire + ElasticSearch.

Obejrzałem o tym Railscast i przeczytałem wiele dokumentacji, ale szczerze mówiąc, jest to ponad moją głową. Chciałbym, żeby ktoś pomógł mi zrozumieć niuanse, których nie mogę pojąć.

Oto część Elasticsearch Resource.rb z mojego modelu:

  include Tire::Model::Search
  include Tire::Model::Callbacks

  mapping do
    indexes :url
    indexes :title,       :boost => 3
    indexes :description, :boost => 2
    indexes :category,    :boost => 1.5, type: 'object',
              properties: {
                name: { type: 'multi_field',
                  fields: { name: { type: 'string', analyzer: 'keyword' } } } }
    indexes :user, type: 'object',
              properties: {
                  username: { type: 'multi_field',
                      fields: { username: { type: 'string', analyzer: 'keyword' } } } }
  end  

  def self.elasticsearch(params)
    tire.search(load: true, page: params[:page], per_page: 20) do
      query { string params[:e], default_operator: "OR" } if params[:e].present?
    end
  end

  def to_indexed_json
    to_json( include: { user: { only: [:username] }, 
                    category: { only: [:name] } 
           } )
  end
  1. Co oznacza „nie analizowane”? W wielu samouczkach, które czytam, używają tego. Jeśli nie jest analizowany, dlaczego znajduje się w mapping do?
  2. Jaki jest cel używania indeksów. Na przykład coś takiego jak indexes :id, type: 'integer'. Dlaczego liczba całkowita musiałaby być indeksowana, czy to pomaga w wydajności czy coś takiego?
  3. Jak zmodyfikować analizator dla adresu URL, aby działał lepiej? Na przykład, jeśli jest przechowywany jako http://www.dropbox.com, wyszukiwanie dropbox.com nie znajdzie wyniku, ale www.dropbox.com tak. Próbowałem wklejać we wszystkich różnych analizatorach i żaden z nich tak naprawdę nie działa dla adresu URL
  4. Jeśli mój category.name jest przechowywany w liczbie mnogiej, np. „książki”, „filmy”, „taśmy”, jak mam powiedzieć analizatorowi, aby patrzył na to słowo w liczbie pojedynczej i mnogiej. Wyszukiwanie „filmu” nie działa, ale „filmy” działa
  5. Gdy usunę load: true, cała moja witryna się psuje. Omówił to w kolejce, ale tylko na chwilę. Czy to oznacza, że ​​muszę przenieść KAŻDY atrybut (i skojarzenie) do mapowania i zmienić go na :not_analyzed? (Właśnie zdałem sobie sprawę… może właśnie odpowiedziałem na moje własne pytanie #1!).
  6. Ogólnie rzecz biorąc, jaki typ danych najlepiej sprawdza się w przypadku OR, a który najlepiej w przypadku AND? Myślę lub wydaje mi się bardziej pobłażliwy, jeśli chodzi o uzyskanie lepszych wyników
2
Tallboy 26 wrzesień 2012, 03:39

2 odpowiedzi

Najlepsza odpowiedź

Wszystko sprowadza się do Lucene: pole indeksowane to pole, w którym chcesz przeszukać. Podczas indeksowania pola możesz zdecydować, czy chcesz je analizować, czy nie. Oznacza to, że można go zindeksować w takiej postaci, w jakiej jest, bez tokenizacji ani stosowania żadnego filtra tokenów. W przeciwnym razie możesz zastosować do niego analizator. Istnieje kilka analizatorów dostępnych po wyjęciu z pudełka z Lucene, wyeksponowanych również w elasticsearch. Analizator składa się z tokenizera oraz listy filtrów tokenów. Tokenizer określa sposób dzielenia zawartości pola na różne sposoby. Za pomocą filtrów tokenów możesz filtrować te terminy i/lub modyfikować je.

Na przykład najczęstszym sposobem tokenizacji jest użycie WhitespaceTokenizer. Następnie możesz zastosować rdzenność na przykład w celu zindeksowania tematów terminów. Na przykład running staje się run, a terminy w liczbie mnogiej stają się liczbą pojedynczą.

Czasami (właściwie dość często) trzeba stworzyć własny analizator łączący tokenizer i filtry tokenów, których chcesz użyć. Możesz to zrobić w elasticsearch w swoich ustawieniach definiujących niestandardowy analizator.

Czasami są pola, których nie chcesz indeksować w lucene, ponieważ nie zamierzasz ich przeszukiwać, ale chcesz je przechowywać. Przechowywane pole to pole, które chcesz zwrócić w wynikach wyszukiwania. W rzeczywistości lucene może przeszukiwać zindeksowane pola, ale może zwracać tylko te zapisane. Na szczęście elasticsearch pomaga nam przechowywać całe dokumenty _source, dzięki czemu otrzymujemy zwróć cały dokument, który domyślnie zindeksowaliśmy. Zawsze możesz wyłączyć tę funkcję, jeśli nie chcesz przechowywać źródła w elasticsearch. W przeciwnym razie, jeśli nie chcesz mieć z powrotem całego źródła podczas zapytania, możesz po prostu określić listę pola, które chcesz odzyskać. Jeśli są przechowywane (możesz to skonfigurować w swoim mapowaniu, wartość domyślna dla każdego pola jest indeksowana, ale nie jest przechowywana) są zwracane natychmiast, w przeciwnym razie są wyodrębniane z samego źródła (jeśli nie są wyłączone). Jeśli masz duże dokumenty, sugeruję skonfigurowanie pól, które chcesz odzyskać, w przeciwnym razie za każdym razem odzyskasz całe źródło.

4
javanna 26 wrzesień 2012, 19:23
  1. Brak analizy oznacza, że ​​pole nie korzysta z potoku analizatora (tokenizery, filtry itp.). Pole nadal można przeszukiwać.

  2. indexes to sposób, w jaki informujesz oponę o polu - to tylko słowo kluczowe dsl do dodania nowego pola (jak column w migracji activerecord). Wszystko w elasticsearch jest indeksowane

  3. Być może będziesz musiał napisać własny analizator. Można to zrobić jako ustawienie indeksu, łącząc ze sobą istniejące tokenizatory, filtry itp.

  4. Skonfiguruj analizator, który jako jeden z filtrów używa jednego z łodyg dostarczonych z elasticsearch

  5. Widzę, że stworzyłeś do tego osobne pytanie

  6. Myślę, że nie można na to odpowiedzieć. To zależy od tego, jakie są dane, czego szukasz

1
Frederick Cheung 26 wrzesień 2012, 12:18