Autocomplete na polach wielowartościowych (faceting)

W poprzednim artykule opisującym możliwe podejście do funkcjonalności autocomplete na polach wielowartościowych skorzystaliśmy z highlightingu, aby wydobyć te informacje, które nas interesowały. Obiecaliśmy także, że wrócimy do tematu i pokażemy, jak osiągnąć podobny efekt z wykorzystaniem facetingu. Zatem, spójrzmy jak wygląda realizacja takiej funkcjonalności.

Kilka słów na początek

Ze względu na to, że jest to niejako kontynuacja poprzedniego wpisu, sugerujemy, aby przeczytać wpis „Autocomplete na polach wielowartościowych (highlighting)„, aby wszystkie elementy wpisu były jasne. Warto także wspomnieć, iż metoda ta była już pokazywana we wpisie „Solr i autocomplete (cz. 1)„, aczkolwiek chcieliśmy przypomnieć ten temat ze względu na częstotliwość pojawiających się pytań.

Konfiguracja

Podobnie, jak w poprzednim wpisie zacznijmy od konfiguracji.

Struktura indeksu

Struktura naszego indeksu nie różni się od tego co zaprezentowane było w poprzednim wpisie. Jednak, przypomnijmy te informacje – zakładamy, że chcemy podpowiadać frazy z indeksu z pola wielowartościowego. Pole to nazywa się features, a cała konfiguracja pól w indeksie będzie następująca:

<fields>
 <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
 <field name="features" type="string" indexed="true" stored="true" multiValued="true"/>
 <field name="features_autocomplete" type="text_autocomplete" indexed="true" stored="true" multiValued="true"/>

 <field name="_version_" type="long" indexed="true" stored="true"/>
</fields>

Do autocomplete będziemy wykorzystywać pole features_autocomplete.

Kopiowanie

Dodatkowo, aby automatycznie zasilać danymi pole features_autocomplete skorzystamy z funkcjonalności copy field, a zatem do pliku schema.xml dodajemy następujący wpis:

<copyField source="features" dest="features_autocomplete"/>

Typ text_autocomplete

Typ text_autocomplete różni się od tego, co widzieliśmy w poprzednim wpisie. Tym razem wygląda on następująco:

<fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100">
 <analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
 </analyzer>
</fieldType>

Ze względu na to, że będziemy korzystać z facetingu korzystamy z solr.KeywordTokenizerFactory oraz sprawiamy, aby wszystkie znaki były małe za pomocą solr.LowerCaseFilterFactory.

Przykładowe dane

Nasze dane są identyczne do tych, które wykorzystaliśmy w poprzednim wpisie i wyglądają następująco:

<add>
 <doc>
  <field name="id">1</field>
  <field name="features">Multiple windows</field>
  <field name="features">Single door</field>
 </doc>
 <doc>
  <field name="id">2</field>
  <field name="features">Single window</field>
  <field name="features">Single door</field>
 </doc>
 <doc>
  <field name="id">3</field>
  <field name="features">Multiple windows</field>
  <field name="features">Multiple doors</field>
 </doc>
</add>

Zapytanie z facetingiem

Zobaczmy zatem, jak wyglądać będzie nasze zapytanie, kiedy wykorzystamy faceting.

Pełne zapytanie

W przypadku facetingu nasze zapytanie powinno wyglądać następująco:

q=*:*&rows=0&facet=true&facet.field=features_autocomplete&facet.prefix=sing

Kilka słów o dodanych parametrach:

  • rows=0 – informujemy Solr, że nie jesteśmy zainteresowani wynikami wyszukiwania,
  • facet=true – informujemy Solr, iż chcemy korzystać z facetingu,
  • facet.field=features_autocomplete – określamy jakie pole ma zostać wykorzystane do facetingu,
  • facet.prefix=sing – za pomocą tego parametru przekazujemy interesującą nas frazę.

Wyniki

Wyniki, które Solr zwraca na powyższe zapytanie, wyglądają następująco:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">0</int>
  <lst name="params">
    <str name="facet">true</str>
    <str name="q">*:*</str>
    <str name="facet.prefix">sing</str>
    <str name="facet.field">features_autocomplete</str>
    <str name="rows">0</str>
  </lst>
</lst>
<result name="response" numFound="3" start="0">
</result>
<lst name="facet_counts">
  <lst name="facet_queries"/>
  <lst name="facet_fields">
    <lst name="features_autocomplete">
      <int name="single door">2</int>
      <int name="single window">1</int>
    </lst>
  </lst>
  <lst name="facet_dates"/>
  <lst name="facet_ranges"/>
</lst>
</response>

Jak widać, w sekcji odpowiedzialnej za faceting, otrzymaliśmy te frazy, które nas interesowały wraz z ilością dokumentów w jakich się znajdują.

O czym pamiętać

Ważną rzeczą jest to, że wartości parametru facet.prefix nie są analizowane, zatem jeżeli zamiast frazy sing przekazalibyśmy frazę Sing Solr nie zwróciłby interesujących nas wyników. Należy o tym pamiętać.

Podsumowanie

Powyższy wpis pokazał drugi sposób podejścia do realizacji funkcjonalności autocomplete na polach wielowartościowych. Oczywiście nie wyczerpaliśmy tematu i kiedyś do niego wrócimy, ale na dzisiaj to wszystko. Mamy nadzieję, że komuś się przyda to co znalazł w tych artykułach 🙂

This post is also available in: angielski

This entry was posted on poniedziałek, Marzec 25th, 2013 at 08:59 and is filed under Autocomplete, Solr. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

2 komentarze to “Autocomplete na polach wielowartościowych (faceting)”

  1. Marcin Says:

    Witam, probuje ten przyklad uruchomic w Solr 5.1 ale nie wychodzi, poniewaz Solr tak jak by ignorowal schema.xml ktora umiescilem w /conf. To sa moje pierwsze kroki z Solr, wiec moze w tym tkwi problem 🙂

  2. gr0 Says:

    Jaką masz dokładnie ścieżkę do plików konfiguracyjnych?