Estoy tratando de hacer un directorio de teléfono/local de búsqueda de negocios utilizando Apache Lucene.Lucene: frases de varias palabras como términos de búsqueda
Tengo campos para el nombre de la calle, nombre comercial, número de teléfono, etc. El problema que tengo es que cuando trato de buscar por la calle donde el nombre de la calle tiene varias palabras (por ejemplo, 'la media luna'), no los resultados son devueltos Pero si trato de buscar con solo una palabra, por ejemplo, 'media luna', obtengo todos los resultados que deseo.
estoy indexación de los datos con la siguiente:
String LocationOfDirectory = "C:\\dir\\index";
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_34);
Directory Index = new SimpleFSDirectory(LocationOfDirectory);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE.34, analyzer);
IndexWriter w = new IndexWriter(index, config);
Document doc = new Document();
doc.add(new Field("Street", "the crescent", Field.Store.YES, Field.Index.Analyzed);
w.add(doc);
w.close();
Mis búsquedas trabajo como este:
int numberOfHits = 200;
String LocationOfDirectory = "C:\\dir\\index";
TopScoreDocCollector collector = TopScoreDocCollector.create(numberOfHits, true);
Directory directory = new SimpleFSDirectory(new File(LocationOfDirectory));
IndexSearcher searcher = new IndexSearcher(IndexReader.open(directory);
WildcardQuery q = new WildcardQuery(new Term("Street", "the crescent");
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
He tratado de intercambio de la consulta comodín para una consulta frase, primero con la totalidad cadena y luego dividir la cadena en espacio en blanco y envolverlos en una BooleanQuery como esta:
String term = "the crescent";
BooleanQuery b = new BooleanQuery();
PhraseQuery p = new PhraseQuery();
String[] tokens = term.split(" ");
for(int i = 0 ; i < tokens.length ; ++i)
{
p.add(new Term("Street", tokens[i]));
}
b.add(p, BooleanClause.Occur.MUST);
Sin embargo, esto no funcionó. Intenté usar un KeywordAnalyzer en lugar de un StandardAnalyzer, pero luego todos los otros tipos de búsqueda dejaron de funcionar también. He intentado reemplazar espacios con otros caracteres (+ y @) y convertir consultas de este formulario, pero todavía no funciona. Creo que no funciona porque + y @ son caracteres especiales que no están indexados, pero parece que no puedo encontrar una lista en la que los personajes sean así.
Estoy empezando a enojarme un poco, ¿alguien sabe lo que estoy haciendo mal?
Gracias, Rik
carácter especial se puede encontrar aquí: http://lucene.apache.org/core/3_5_0/queryparsersynta x.html # N10180. – Oliver