Rus*_*hik 2 lucene solr fuzzy-search
我试图通过使用 lucene 来实现模糊短语搜索(以匹配拼写错误的单词),通过参考我想在模糊短语搜索上尝试 ngram 索引的各种博客。
但我找不到 ngram tokenizer 作为我的 lucene3.4 JAR 库的一部分,它是否已被弃用并被其他东西替换?- 目前我正在使用 standardAnalyzer,我在术语的精确匹配方面获得了不错的结果。
我有以下两个要求需要处理。
我的索引有包含短语“xyz abc pqr”的文档,当我提供查询“abc xyz”~5时,我能够获得结果,但我的要求是获得同一文档的结果,即使我有一个额外的单词,如“ abc xyz pqr tst" 在我的查询中(我知道匹配分数会少一些) - 在短语中使用邻近额外单词不起作用,如果我从查询中删除邻近和双引号 " ",我会得到预期的结果(但有我收到许多误报,例如仅包含 xyz、仅 abc 等的文档。)
在上面的例子中,如果有人拼错查询“abc xxz”,我仍然想获得同一文档的结果。
我想尝试一下 ngram,但不确定它是否会按预期工作。
有什么想法吗 ?
小智 5
尝试使用BooleanQuery并FuzzyQuery喜欢:
public void fuzzysearch(String querystr) throws Exception{
querystr=querystr.toLowerCase();
System.out.println("\n\n-------- Start fuzzysearch -------- ");
// 3. search
int hitsPerPage = 10;
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
IndexReader reader = IndexReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
BooleanQuery bq = new BooleanQuery();
String[] searchWords = querystr.split(" ") ;
int id=0;
for(String word: searchWords ){
Query query = new FuzzyQuery(new Term(NAME,word));
if(id==0){
bq.add(query, BooleanClause.Occur.MUST);
}else{
bq.add(query, BooleanClause.Occur.SHOULD);
}
id++;
}
System.out.println("query ==> " + bq.toString());
searcher.search(bq, collector );
parseResults( searcher, collector ) ;
searcher.close();
}
public void parseResults(IndexSearcher searcher, TopScoreDocCollector collector ) throws Exception {
ScoreDoc[] hits = collector.topDocs().scoreDocs;
// 4. display results
System.out.println("Found " + hits.length + " hits.");
for(int i=0;i<hits.length;++i) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
System.out.println((i + 1) + ". " + d.get(NAME));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2222 次 |
| 最近记录: |