Tôi đang cố gắng tạo danh bạ doanh nghiệp/địa phương có thể tìm kiếm bằng cách sử dụng Apache Lucene.Lucene: Cụm từ nhiều từ như cụm từ tìm kiếm
Tôi có các trường tên đường, tên doanh nghiệp, số điện thoại, v.v. Vấn đề tôi gặp phải là khi tôi cố gắng tìm kiếm theo đường phố nơi tên phố có nhiều từ (ví dụ: 'lưỡi liềm'), không kết quả được trả về. Nhưng nếu tôi cố gắng tìm kiếm chỉ với một từ, ví dụ như 'lưỡi liềm', tôi nhận được tất cả các kết quả mà tôi muốn.
Tôi đang lập chỉ mục dữ liệu như sau:
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();
tìm kiếm của tôi làm việc như thế này:
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;
Tôi đã cố gắng trao đổi các truy vấn wildcard cho một truy vấn cụm từ, đầu tiên với toàn bộ chuỗi và sau đó tách chuỗi trên không gian màu trắng và gói chúng trong một BooleanQuery như thế này:
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);
Tuy nhiên, điều này không hoạt động. Tôi đã thử sử dụng KeywordAnalyzer thay vì StandardAnalyzer, nhưng sau đó tất cả các loại tìm kiếm khác cũng ngừng hoạt động. Tôi đã thử thay thế không gian bằng các ký tự khác (+ và @) và chuyển đổi truy vấn đến và từ biểu mẫu này, nhưng điều đó vẫn không hoạt động. Tôi nghĩ rằng nó không hoạt động vì + và @ là các ký tự đặc biệt không được lập chỉ mục, nhưng tôi dường như không thể tìm thấy danh sách ở bất kỳ đâu có ký tự giống như vậy.
Tôi bắt đầu phát điên, có ai biết tôi đang làm gì sai không?
Cảm ơn, Rik
nhân vật đặc biệt có thể được tìm thấy ở đây: http://lucene.apache.org/core/3_5_0/queryparsersynta x.html # N10180. – Oliver