2011-01-13 5 views
7

У меня есть база данных URL-адресов, которые я бы хотел найти. Поскольку URL-адреса не всегда написаны одинаково (возможно, или не имеют www), я ищу правильный способ URL-адресов и запросов. Я попробовал несколько вещей, и я думаю, что я близко, но не знаю, почему он не работает:Индексирование и запрос URLS в Solr

Вот мой пользовательский тип поля:

<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> 

Например:

http://www.twitter.com/AndersonCooper когда индексируются, будет иметь следующие слова в различных положениях: HTTP, WWW, твиттер, ком, Андерсон Купер

Если я ищу просто twitter.com/andersoncooper, я хотел бы этот запрос в соответствии с записью, индексированную , поэтому Я также использую WDF для разделения поискового запроса, , однако поисковый запрос заканчивается так:

myfield :("twitter com andersoncooper"), когда он действительно хочет, чтобы он соответствовал всем записям, которые имеют все следующие отдельные слова: twitter com andersoncooper

Есть ли другой фильтр запроса или токенизатор, который я должен использовать?

+1

Вы когда-нибудь заканчивали сортировку этого? – Cyrus

+1

Вы подсчитали, что нужно делать здесь? –

ответ

-1

Вы можете попробовать keyword tokenizer

Из книги Solr 1.4 Enterprise Search Server опубликованной Packt

KeywordTokenizerFactory: Это не на самом деле делать какие-либо лексемизацию или вообще ничего для этого дело! Он возвращает исходный текст как один термин. Есть случаи, когда у вас есть поле , которое всегда получает одно слово, но вам нужно сделать базовый анализ как нижний. Однако более вероятно, что из-за сортировки или требований к огранке потребуется индексированное поле не более один срок. Конечно, поле идентификатора документа , если оно указано, а не , будет использовать это число.

+0

Это не будет работать для запросов, описанных в OP – Gus

0

Это должно быть самым простым решением:

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

Но для вас требование вам нужно будет сделать его многозначным и индексируют 1. не изменяет 2. без HTTP 3.без WWW

или сделать URL для поиска с помощью подстановочных знаков на фронте (который медленнее, я думаю)

+0

Да, 'string', если из' StrField', он не будет анализироваться, но может быть сохранен/проиндексирован, он подходит для url, я думаю. –

+0

Это не будет работать для запросов OP, которые указывают только на части URL-адреса – Gus

0

Если я понимаю, это заявление от вашего вопроса

MyField :(«твиттер ком Андерсон Купер») когда на самом деле хотите, чтобы соответствовать все записи, имеющие все следующие отдельные слова: твиттер ком Андерсон Купер

Вы пытаетесь написать запрос, который соответствовал бы как:

http://www.twitter.com/AndersonCooper 

и

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

(обе ссылки содержат все лексем), но не совпадают ни

http://www.facebook.com/AndersonCooper 

или

http://www.twitter.com/AliceCooper 

Если это правильно, ваша существующая конфигурация должна k просто отлично. Предполагая, что вы используете стандартный анализатор запросов и вы запрашиваете через завиток или какой-либо другой основе URL механизма, необходимо параметр запроса, чтобы выглядеть следующим образом:

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

Один из подводных камней, которые могут быть отключение вас заключается в том, что оператор запроса по умолчанию (между терминами в запросе) является «OR», поэтому AND должен быть явно указан выше. Альтернативно, чтобы сэкономить некоторое пространство, вы можете изменить оператор запроса по умолчанию на «И» следующим образом:

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