2011-01-13 12 views
7

Ho un database di URL che vorrei cercare. Poiché gli URL non sono sempre scritti allo stesso modo (può o non può avere www), sto cercando il modo corretto per gli URL di indice e di query. Ho provato un paio di cose, e penso di essere vicino, ma non so perché non funziona:URLing e interrogazione URL in Solr

Qui è il mio tipo di campo personalizzato:

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

Ad esempio:

http://www.twitter.com/AndersonCooper quando indicizzati, avrà le seguenti parole in diverse posizioni: http, www, twitter, com, Anderson Cooper

Se cerco semplicemente twitter.com/andersoncooper~~V~~singular~~3rd, vorrei questa query per abbinare il record che è stato indicizzato , ed è per questo Io uso anche la WDF per dividere la query di ricerca, , ma la query di ricerca finisce per essere così:

myfield :("twitter com andersoncooper") quando veramente vuole che corrisponda a tutti i record che hanno tutti i seguenti distinti parole: twitter com andersoncooper

Esiste un filtro o un tokenizzatore di query diversi che dovrei utilizzare?

+1

hai mai finito per risolvere questo? – Cyrus

+1

Hai capito cosa dobbiamo fare qui? –

risposta

-1

È possibile provare la keyword tokenizer

Dal libro Solr 1.4 Enterprise Search Server pubblicato da Packt

KeywordTokenizerFactory: Questo non effettivamente eseguire una tokenizzazione o niente affatto per quello importa! È restituisce il testo originale come un termine. Ci sono casi in cui si ha un campo che riceve sempre una parola, ma è necessario fare alcune analisi di base come il minuscolo. Tuttavia, è più probabile che a causa di ordinamento o requisiti di sfaccettatura richiederà un campo indicizzato con non più di un termine. Certamente il campo identificatore del documento, se fornito e non un numero, userebbe questo.

+0

Questo non funzionerà per le domande descritte dall'OP – Gus

0

Questa dovrebbe essere la soluzione più semplice:

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

Ma per voi requisito avrete bisogno per rendere più multivalore e indicizzarlo 1. nessuna richiesta di modifica 2. senza http 3.senza www

o fare l'URL ricercabili attraverso i caratteri jolly nella parte anteriore (che è più lento immagino)

+0

Sì, 'stringa' se da' StrField', non sarà analizzato, ma potrebbe essere memorizzato/indicizzato, è corretto per l'URL, immagino. –

+0

Questo non funzionerà per le query dell'OP che specificano solo parti dell'URL – Gus

0

Se ho ben capito questa dichiarazione dalla tua domanda

myfield :("Twitter com Anderson Cooper") quando in realtà lo vogliono per abbinare tutti i record che hanno tutte le seguenti parole separate: Twitter com Anderson Cooper

si sta tentando di scrivere una query che sarebbe partita sia:

http://www.twitter.com/AndersonCooper 

e

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

(entrambi i link contengono tutte dei gettoni), ma non corrispondono né

http://www.facebook.com/AndersonCooper 

o

http://www.twitter.com/AliceCooper 

Se questo è corretto, la tua configurazione esistente dovrebbe essere wor k bene. Supponendo che si sta utilizzando il parser query standard e si sta interrogando via ricciolo o qualche altro meccanismo basato URL, è necessario il parametro di query per assomigliare a questo:

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

Uno dei trucchi che possono avere voi state inciampare è che l'operatore di query predefinito (tra i termini in una query) è "OR", motivo per cui gli AND devono essere esplicitamente specificati sopra. In alternativa, per risparmiare spazio, è possibile modificare l'operatore di query predefinito in "AND" in questo modo:

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