Domanda

Sto costruendo una funzione di ricerca per un sito Web php usando Zend Lucene e sto riscontrando un problema. Il mio sito web è un direttore del negozio (qualcosa del genere).

Ad esempio ho un negozio chiamato " FooBar " ma i miei visitatori cercano "Foo Bar" e ottieni zero risultati. Anche se un negozio è chiamato "Foo Bar" e il visitatore cerca "FooBar" non viene trovato nulla.

Ho provato a cercare " foobar ~ " (fuzzy seach) ma non ho trovato articoli denominati " Foo Bar "

Esiste un modo specifico per creare l'indice o creare la query?

È stato utile?

Soluzione

Opzione 1: spezza la stringa della query di input in due parti in vari punti e cercale. per esempio. In questo caso la query sarebbe (+ fo + bar) OR (+ foo + bar) OR (+ foob + ar) Il problema è che questa tokenizzazione presuppone che ci siano due token nella stringa della query di input. Inoltre, potresti ottenere risultati extra, forse irrilevanti, come i risultati di (+ foob + ar)

Opzione 2: utilizzare la tokenizzazione n-gram durante l'indicizzazione e l'interrogazione. Durante l'indicizzazione dei token per "barra foo". sarebbe fo, oo, ba, ar. Durante la ricerca con foobar, i token sarebbero fo, oo, ob, ba, ar. La ricerca con OR come operatore ti darà i documenti con il massimo numero di corrispondenze n-grammi in alto. Ciò può essere ottenuto con NGramTokenizer

Altri suggerimenti

Aggiungi manualmente voci di indice per le confusioni di nomi più comuni. Chiedi ai tuoi clienti di inserirli in un modulo speciale.

Hai provato " * foo * AND * bar * " o " * foo * OR * bar * " ;? Funziona in Furetto e ho letto che si basa su Lucene.

Se non ti interessano le prestazioni, usa WildcardQuery (le prestazioni sono significativamente peggiori):

new WildcardQuery( new Term( "propertyName", "Foo?Bar" ) );

Per zero o più caratteri, usa '*', per zero o un carattere, usa '?'

Se le prestazioni sono importanti, prova a utilizzare BooleanQuery.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top