Usiłuję utworzyć możliwy do wyszukania telefon/lokalny katalog firmowy przy użyciu Apache Lucene.Lucene: Wyrażenia składające się z wielu wyrazów jako kryteria wyszukiwania
Mam pola dla nazwy ulicy, nazwy firmy, numeru telefonu itp. Problem, który mam, polega na tym, że gdy próbuję wyszukiwać według ulicy, gdzie ulica ma wiele słów (np. "Półksiężyc"), nie ma wyniki są zwracane. Ale jeśli spróbuję wyszukać za pomocą tylko jednego słowa, np. "Półksiężyca", otrzymam wszystkie wyniki, które chcę.
jestem indeksowania danych z następujących czynności:
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();
moich poszukiwań działa tak:
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;
Próbowałem swapping zapytanie wieloznaczny dla zapytania frazy, najpierw z całą łańcuch, a następnie dzielenie łańcucha na białą przestrzeń i zawijanie ich w BooleanQuery w następujący sposób:
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);
To jednak nie zadziałało. Próbowałem użyć KeywordAnalyzer zamiast StandardAnalyzer, ale wtedy wszystkie inne typy wyszukiwania również przestały działać. Próbowałem zastąpić spacje innymi znakami (+ i @) i konwertować zapytania do iz tego formularza, ale to nadal nie działa. Myślę, że to nie działa, ponieważ znaki + i @ są znakami specjalnymi, które nie są indeksowane, ale nie mogę znaleźć listy gdziekolwiek tego rodzaju postaci.
Zaczynam szaleć, czy ktoś wie, co robię źle?
Dzięki Rik
specjalny charakter można znaleźć tutaj: http://lucene.apache.org/core/3_5_0/queryparsersynta x.html # N10180. – Oliver