lucene in action
1. 索引——好比字典的索引一样,进行查询时使用
2. Field.Index.NO 则没有索引,则不能被搜索
3.
第三章
PhraseQuery 短语查询
按照顺序添加term
PharseQuery 短语查询的评分:
public class App
{
public static void main( String[] args ) throws IOException, ParseException
{
Directory dir = new RAMDirectory();
IndexWriterConfig conf = new IndexWriterConfig(new WhitespaceAnalyzer());
IndexWriter writer = new IndexWriter(dir, conf);
Document doc = new Document();
doc.add(new TextField("text", "lazy dog jump over cat", Field.Store.YES));
writer.addDocument(doc);
doc = new Document();
doc.add(new TextField("text", "lazy haha dog lala jump ooo over this cat", Field.Store.YES));
writer.addDocument(doc);
doc = new Document();
doc.add(new TextField("text", "dog lazy haha pig lala jump ooo over this cat", Field.Store.YES));
writer.addDocument(doc);
IndexReader reader = DirectoryReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
// Query query = new MatchAllDocsQuery();
QueryParser parser = new QueryParser("text", new WhitespaceAnalyzer());
parser.setDefaultOperator(Operator.AND);
Query query = parser.parse("\"dog cat\"~5");
System.out.println("query["+query.toString()+"]");
TopDocs hits = searcher.search(query, 10);
System.out.println(hits.totalHits);
ScoreDoc[] docs = hits.scoreDocs;
for(ScoreDoc scoreDoc : docs){
int docID = scoreDoc.doc;
float score = scoreDoc.score;
Document docu = searcher.doc(docID);
System.out.println(docID+" - "+score+" - "+docu.get("text"));
}
}
}
经测试,
首先,只返回符合条件的查询结果。如:查找slop=2的,那么项间距大于2的不会被检索到。
其次,短语查询不是布尔查询。它根据匹配所需要的编辑距离来进行评分。返回的结果中,项之间距离越小,评分越高,排序越靠前。
最后,松散的短语查询不需要按照顺序进行匹配,但是SpanNearQuery能够确保按照顺序匹配。
第四章 分析器
同义词过滤器实现:
直观想法是在有同义词的位置插入同义词,位置增量为0.
实现起来和直观想法不一样,因为TokenStream是流。具体实现的思路是:
incrementToken每一次执行打印一个token, 我们应该是在有同义词的token的下一个token打印出需要插入的同义词。
判断有同义词- 》存储到缓存, 下一次循环 -》先判断缓存是否有需要展示的同义词, 有则打印。

浙公网安备 33010602011771号