2012-03-23 14 views
6

Przeczytałem wielokrotnie dokument wiki Solra podświetlający, przeszukiwany wszędzie, ale nie mogę uzyskać nawet podstawowego podświetlenia, aby pracować z moją instalacją Solr. Używam Solr 3.5 na demo Jetty 6.1.Dlaczego ta prosta próba podkreślenia Solr nie działa?

Zindeksowałem dokumenty o rozmiarze 250 KB i mogę je dokładnie przeszukać. Inne niż konfigurowanie moje definicje pól dokumentu, większość konfiguracji Solr jest „od ręki”, chociaż mam chwilowo wykomentowane „Podświetlenie domyślne” The solrconfig.xml, aby upewnić się, że nie są przyczyną tego problemu:

<!-- Highlighting defaults 
    <str name="hl">on</str> 
    <str name="hl.fl">title snippet</str> 
    <str name="f.name.hl.fragsize">0</str> 
    <str name="f.name.hl.alternateField">name</str> --> 

Moje zapytanie o URL jest bardzo proste. Próbowałem wiele odmian, ale tutaj jest moje ostatnie z nim powrocie zapytanie najbardziej podstawowe:

hl=on&hl.fl=title&indent=on&version=2.2&q=toyota&fq=&start=0&rows=1&fl=*%2Cscore 

Oto wynikające XML:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 

<lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">32</int> 
    <lst name="params"> 
    <str name="explainOther"/> 
    <str name="indent">on</str> 
    <str name="hl.fl">title</str> 
    <str name="wt"/> 
    <str name="hl">true</str> 
    <str name="version">2.2</str> 
    <str name="rows">1</str> 
    <str name="fl">*,score</str> 
    <str name="start">0</str> 
    <str name="q">toyota</str> 
    <str name="qt"/> 
    <str name="fq"/> 
    </lst> 
</lst> 
<result name="response" numFound="9549" start="0" maxScore="0.9960097"> 
    <doc> 
    <float name="score">0.9960097</float> 
    <str name="id">2-33-200</str> 
    <str name="title">1992 Toyota Camry 2.2L CV Boots</str> 
    </doc> 
</result> 
<lst name="highlighting"> 
    <lst name="2-33-200"/> 
</lst> 
</response> 

Jak można debugować ten problem dalej? Dzięki! To jest sekcja <highlighting> z pliku solrconfig.xml. Jak już powiedziałem, jest to czas. To może być problem, ale jestem nowy w Solr i nie jestem zaznajomiony z podkreślaniem ins - outów (oczywiście).

<highlighting> 
    <!-- Configure the standard fragmenter --> 
    <!-- This could most likely be commented out in the "default" case --> 
    <fragmenter name="gap" 
       default="true" 
       class="solr.highlight.GapFragmenter"> 
    <lst name="defaults"> 
     <int name="hl.fragsize">100</int> 
    </lst> 
    </fragmenter> 

    <!-- A regular-expression-based fragmenter 
     (for sentence extraction) 
    --> 
    <fragmenter name="regex" 
       class="solr.highlight.RegexFragmenter"> 
    <lst name="defaults"> 
     <!-- slightly smaller fragsizes work better because of slop --> 
     <int name="hl.fragsize">70</int> 
     <!-- allow 50% slop on fragment sizes --> 
     <float name="hl.regex.slop">0.5</float> 
     <!-- a basic sentence pattern --> 
     <str name="hl.regex.pattern">[-\w ,/\n\&quot;&apos;]{20,200}</str> 
    </lst> 
    </fragmenter> 

    <!-- Configure the standard formatter --> 
    <formatter name="html" 
      default="true" 
      class="solr.highlight.HtmlFormatter"> 
    <lst name="defaults"> 
     <str name="hl.simple.pre"><![CDATA[<em>]]></str> 
     <str name="hl.simple.post"><![CDATA[</em>]]></str> 
    </lst> 
    </formatter> 

    <!-- Configure the standard encoder --> 
    <encoder name="html" 
      class="solr.highlight.HtmlEncoder" /> 

    <!-- Configure the standard fragListBuilder --> 
    <fragListBuilder name="simple" 
        default="true" 
        class="solr.highlight.SimpleFragListBuilder"/> 

    <!-- Configure the single fragListBuilder --> 
    <fragListBuilder name="single" 
        class="solr.highlight.SingleFragListBuilder"/> 

    <!-- default tag FragmentsBuilder --> 
    <fragmentsBuilder name="default" 
        default="true" 
        class="solr.highlight.ScoreOrderFragmentsBuilder"> 
    <!-- 
    <lst name="defaults"> 
     <str name="hl.multiValuedSeparatorChar">/</str> 
    </lst> 
    --> 
    </fragmentsBuilder> 

    <!-- multi-colored tag FragmentsBuilder --> 
    <fragmentsBuilder name="colored" 
        class="solr.highlight.ScoreOrderFragmentsBuilder"> 
    <lst name="defaults"> 
     <str name="hl.tag.pre"><![CDATA[ 
      <b style="background:yellow">,<b style="background:lawgreen">, 
      <b style="background:aquamarine">,<b style="background:magenta">, 
      <b style="background:palegreen">,<b style="background:coral">, 
      <b style="background:wheat">,<b style="background:khaki">, 
      <b style="background:lime">,<b style="background:deepskyblue">]]></str> 
     <str name="hl.tag.post"><![CDATA[</b>]]></str> 
    </lst> 
    </fragmentsBuilder> 

    <boundaryScanner name="default" 
        default="true" 
        class="solr.highlight.SimpleBoundaryScanner"> 
    <lst name="defaults"> 
     <str name="hl.bs.maxScan">10</str> 
     <str name="hl.bs.chars">.,!? &#9;&#10;&#13;</str> 
    </lst> 
    </boundaryScanner> 

    <boundaryScanner name="breakIterator" 
        class="solr.highlight.BreakIteratorBoundaryScanner"> 
    <lst name="defaults"> 
     <!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE --> 
     <str name="hl.bs.type">WORD</str> 
     <!-- language and country are used when constructing Locale object. --> 
     <!-- And the Locale object will be used when getting instance of BreakIterator --> 
     <str name="hl.bs.language">en</str> 
     <str name="hl.bs.country">US</str> 
    </lst> 
    </boundaryScanner> 
</highlighting> 

Edit Chociaż początkowo mój "tytuł" polu została ustawiona indeksowane = "false" I od tego czasu testowany ustawienie go na true (bez zmian/no podświetlanie nadal), a także termVectors = "true" termPositions = "true" termOffsets = "true" ... nadal nie działa. (Próbowałem je na podstawie odczytu this post to SO.)

I tu jest moje "title" definicja pola już teraz:

<field name="title" type="string" indexed="true" stored="true" required="true" termVectors="true" termPositions="true" termOffsets="true" /> 

Początkowo zacząłem:

<field name="title" type="string" indexed="false" stored="true" required="true" /> 

Edit I Teraz wypróbowaliśmy tę definicję:

<field name="title" type="text_general" indexed="true" stored="true" required="true" termVectors="true" termPositions="true" termOffsets="true" /> 

i bez zmiany podświetlania, nadal nie działa. Moja text_general definicja jest jeden domyślny, który pochodzi z dema SOLR za:

<!-- A general text field that has reasonable, generic 
     cross-language defaults: it tokenizes with StandardTokenizer, 
removes stop words from case-insensitive "stopwords.txt" 
(empty by default), and down cases. At query time only, it 
also applies synonyms. --> 
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <!-- in this example, we will only use synonyms at query time 
     <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
     --> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Edit ja teraz też starał tytuł ponownego indeksowania z FieldType text_en_splitting, który wykorzystuje WhitespaceTokenizerFactory zamiast StandardTokenizerFactory, i nadal nie ma podświetlanie. O ile warto, używam standardowego analizatora zapytań, który według debugQuery = on jest LuceneQParser.

WRESZCIE! Dzięki @javanna za pomoc. Zrobiłem wiele eksperymentów, a dwa kluczowe odejścia to:

  1. Musisz użyć typu pola tokenizującego. Typ pola ciąg nie będzie działać. Nie ma potrzeby indeksowania = true lub termVectors = true, ale typ pola musi być tokenizowany.
  2. Musisz uważać, aby odwoływać się do pól we właściwym przypadku. Oprócz skorodowania tokena, zmieniłem również przypadek na polach podczas opracowywania i zapomniałem zmienić wielkość liter w polu hl.fl (wyróżnione pole) - zapobiegając podświetlaniu.
  3. Upewnij się, że ponownie indeksujesz każdą zmianę konfiguracji. Aby być bezpiecznym, kasowałem wszystkie dokumenty z indeksu i przebudowywałem je od podstaw, ale to może nie być konieczne.

Moja definicja pojawi się jako:

<field name="Title" type="text_general" indexed="false" stored="true" required="true" /> 

A moja solrconfig.xml ma ten zestaw:

<str name="hl">on</str> 
<str name="hl.fl">Title</str> 
+0

Czy możesz umieścić swoją definicję pola tytułu w swoim pliku schema.xml? – javanna

+0

Pewnie, przepraszam, że początkowo to opuściłem. –

+0

Dzięki! Jeszcze jedno: jaka jest definicja ciągu typu fieldType w pliku schema.xml? Domyślny lub coś innego? – javanna

Odpowiedz

11

Sposób robisz podświetlanie wydaje się dobre, ale twój solrconfig.xml wygląda trochę niechlujnie. Niestety, podany przez Ciebie przykład w zasadzie wykorzystuje wszystkie dostępne opcje i domyślam się, że ich nie potrzebujesz. Jeśli nie potrzebujesz czegoś innego niż domyślne, zacznę komentować wszystkie ustawienia podświetlania, a także parametry domyślne. Potem będę grał z parametrami URL, których potrzebujesz, po prostu para, aby rozpocząć: hl = on i hl.fl = title. Po znalezieniu właściwych parametrów możesz je skonfigurować jako domyślne.

To powiedziawszy, biorąc pod uwagę twój tytuł fieldType I podejrzewam, że nie jest tokenized, chyba że zmieniłeś domyślną definicję typu łańcucha. W takim przypadku zapytanie nie będzie pasowało do pola tytułu, dlatego nie zostanie podświetlone na nim. Czy może używasz edismax (lub dismaxax)? Jeśli tak, jaki jest twój parametr qf? Czy to możliwe, że termin toyota znajduje się na innym polu, które pasuje do twojego zapytania? Jeśli używasz edismax, możesz spróbować wyszukać q = title: toyota i sprawdzić, czy dostałeś wyniki.

Możesz także sprawdzić, gdzie jest twój mecz, umożliwiając debugQuery = na i sprawdzanie danych wyjściowych debugowania.

UPDATE
Widziałem, jak zmieniła się tytułowy FieldType do text_general, ale to niczego nie zmienia, bo to nie jest typ tokenized na whitespaces. Jeszcze nie powiedział, co kwerenda parser używasz, w każdym razie jeśli mam rację należy użyć WhitespaceTokenizerFactory zamiast StandardTokenizerFactory:

<tokenizer class="solr.WhitespaceTokenizerFactory"/> 

Po tym, należy pamiętać, aby reindex wszystkie swoje dane, inaczej won” t zobacz jakąkolwiek zmianę. Zasadniczo, jeśli indeksujesz coś takiego jak toyota whatever bez tokenizacji na białych znakach, nie uzyskasz żadnego wyniku wyszukiwania toyota, a na tym polu nie zostanie podświetlony toyota, ponieważ nie pasuje on do siebie. Zakładam, że używasz parsera zapytań dismax lub edismax i przeszukujesz więcej niż jedno pole, a niektóre z nich, ale bez tytułu, pasują do wyszukiwania, dlatego możesz uzyskać wyniki, ale nie podświetlając na title, jedynym wybranym polu do podświetlania. Czy możesz opublikować wyniki wyszukiwania dla: toyota? Czy termin toyota dotyczy innych pól niż title?

+0

Tak, wygląda na niechlujny, ale jest to domyślna konfiguracja dostępna w Solr 3.5. :) Nie używam dismax lub edismax, chyba że jest to domyślna konfiguracja. W poniedziałek, kiedy wrócę do pracy, spróbuję twoich sugestii, dzięki! –

+2

@ MasonG.Zhwiti Nie powinienem tego mówić, ale ... nigdy nie ufaj przykładom solr :) Naprawdę, aby zrozumieć jak działa SOlr, lepiej zacząć od prawie pustego schematu i czystej konfiguracji. Daj mi znać, jeśli mogę pomóc więcej! – javanna

+0

Nadal pracuję nad zresetowaniem konfiguracji do czegoś więcej barebones, ale do tej pory próbowałem zmienić tytuł fieldType na text_general, zi bez termVector = true, i to nie zrobiło nic dla mnie pod względem podświetlania. –

Powiązane problemy