2011-01-13 12 views
7

Mam bazę adresów URL, które chciałbym przeszukać. Ponieważ adresy URL nie zawsze są napisane tak samo (mogą, ale nie muszą zawierać strony www), szukam poprawnego adresu URL indeksu i zapytania. Próbowałem kilka rzeczy i myślę, że jestem blisko, ale nie wiem, dlaczego to nie działa:Indeksowanie i kwerendowanie adresów URL w Solr

Oto mój typ pole niestandardowe:

<fieldType name="customUrlType" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" preserveOriginal="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" preserveOriginal="0"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Na przykład:

http://www.twitter.com/AndersonCooper gdy indeksowane, będą miały następujące słowa w różnych pozycjach: http, www, twitter, com, Anderson Cooper

Gdybym szukać po prostu twitter.com/andersoncooper chciałbym tę kwerendę, aby dopasować rekord, który był indeksowany , dlatego Używam również WDF do podzielenia zapytania, , jednak zapytanie wygląda tak:

myfield :("twitter com andersoncooper"), gdy naprawdę chce, aby pasowało do wszystkich rekordów, które mają wszystkie następujące elementy: słowa: twitter com andersoncooper

Czy powinienem użyć innego filtru zapytań lub tokenizera?

+1

Czy zdarzyło Ci się to rozwiązać? – Cyrus

+1

Czy wymyśliłeś, co trzeba tutaj zrobić? –

Odpowiedz

-1

Można spróbować keyword tokenizer

z książki Solr 1.4 Enterprise Search Server opublikowanej przez Packt

KeywordTokenizerFactory: To nie faktycznie żadnego tokenizacja lub w ogóle nic do tego materia! To zwraca oryginalny tekst jako jeden termin. Istnieją przypadki, w których istnieje pole , które zawsze otrzymuje jedno słowo, ale należy wykonać podstawową analizę , podobnie jak obniżenie wartości. Prawdopodobnie jednak z powodu sortowania lub wymagań związanych z sortowaniem wymagane będzie indeksowane pole z nie więcej niż jednym terminem. Z pewnością pole identyfikacyjne dokumentu, o numerze , jeśli zostanie podane, a nie numer, użyłoby tego.

+0

To nie zadziała dla zapytań opisywanych przez OP – Gus

0

ten powinien być najbardziej najprostsze rozwiązanie:

<field name="iconUrl" type="string" indexed="true" stored="true" /> 

ale dla ciebie wymogu trzeba będzie zrobić to wielowartościowe i wskaźnik nie zmienia to 1. 2. bez http 3.bez www

lub dokonać URL przeszukiwania poprzez symbole wieloznaczne z przodu (co jest wolniejsze chyba)

+0

Tak, 'string' jeśli z' StrField', to nie będzie analizowane, ale może być przechowywane/indeksowane, to jest właściwe dla adresu URL, tak myślę. –

+0

To nie zadziała w przypadku zapytań OP, które określają tylko części adresu URL – Gus

0

Jeśli dobrze rozumiem to stwierdzenie z pytaniem

myField :(„twitter com Anderson Cooper”) jeśli naprawdę chcesz, aby dopasować wszystkie rekordy, które mają wszystkie z następujących oddzielnych słów: twitter com Anderson Cooper

próbujesz napisać zapytanie, które odpowiadają zarówno:

http://www.twitter.com/AndersonCooper 

i

http://www.andersoncooper.com/socialmedia/twitter 

(oba linki zawierają wszystkie z tokenów), ale nie pasuje albo

http://www.facebook.com/AndersonCooper 

lub

http://www.twitter.com/AliceCooper 

Jeśli to prawda, twoja istniejąca konfiguracja powinna być gorsza K w porządku. Zakładając, że używasz standardowego parser zapytań i jesteś zapytań poprzez zwinięcie lub innego mechanizmu url opartej trzeba parametr kwerendy wyglądać następująco:

&q=myField:andersoncooper AND myField:twitter AND myField:com 

Jedną z pułapek, które mogły być potknięcia cię jest to, że domyślnym operatorem kwerendy (między wyrażeniami w zapytaniu) jest "LUB", dlatego też ORAZ muszą być jawnie określone powyżej. Alternatywnie, aby zaoszczędzić trochę miejsca, możesz zmienić domyślny operator zapytania na "AND" w następujący sposób:

&q.op=AND&q=myField:(andersoncooper twitter com)