Lucene5学习之PhraseQuery短语查询

    PhraseQuery:短语查询,就是查询文档中是否包含指定的一个Term或多个Term,多个Term之间可以指定间隔即slop参数,官方API解释如图:


    使用示例代码,如下:

 

Java代码   收藏代码
  1. package com.yida.framework.lucene5.query;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.document.Field;  
  9. import org.apache.lucene.document.TextField;  
  10. import org.apache.lucene.index.DirectoryReader;  
  11. import org.apache.lucene.index.IndexReader;  
  12. import org.apache.lucene.index.IndexWriter;  
  13. import org.apache.lucene.index.IndexWriterConfig;  
  14. import org.apache.lucene.index.IndexWriterConfig.OpenMode;  
  15. import org.apache.lucene.index.Term;  
  16. import org.apache.lucene.search.IndexSearcher;  
  17. import org.apache.lucene.search.PhraseQuery;  
  18. import org.apache.lucene.search.ScoreDoc;  
  19. import org.apache.lucene.search.TopDocs;  
  20. import org.apache.lucene.store.Directory;  
  21. import org.apache.lucene.store.RAMDirectory;  
  22.   
  23. public class PhraseQueryTest {  
  24.     public static void main(String[] args) throws IOException {  
  25.         Directory dir = new RAMDirectory();  
  26.         Analyzer analyzer = new StandardAnalyzer();  
  27.         IndexWriterConfig iwc = new IndexWriterConfig(analyzer);  
  28.         iwc.setOpenMode(OpenMode.CREATE);  
  29.         IndexWriter writer = new IndexWriter(dir, iwc);  
  30.   
  31.         Document doc = new Document();  
  32.         doc.add(new TextField("text""quick brown fox", Field.Store.YES));  
  33.         writer.addDocument(doc);  
  34.           
  35.         doc = new Document();  
  36.         doc.add(new TextField("text""jumps over lazy broun dog", Field.Store.YES));  
  37.         writer.addDocument(doc);  
  38.           
  39.         doc = new Document();  
  40.         doc.add(new TextField("text""jumps over extremely very lazy broxn dog", Field.Store.YES));  
  41.         writer.addDocument(doc);  
  42.           
  43.           
  44.         writer.close();  
  45.   
  46.         IndexReader reader = DirectoryReader.open(dir);  
  47.         IndexSearcher searcher = new IndexSearcher(reader);  
  48.           
  49.         String term1 = "dog";  
  50.         String term2 = "jumps";  
  51.         PhraseQuery phraseQuery = new PhraseQuery();  
  52.         phraseQuery.add(new Term("text",term1));  
  53.         phraseQuery.add(new Term("text",term2));  
  54.         phraseQuery.setSlop(15);  
  55.           
  56.         TopDocs results = searcher.search(phraseQuery, null100);  
  57.         ScoreDoc[] scoreDocs = results.scoreDocs;  
  58.           
  59.         for (int i = 0; i < scoreDocs.length; ++i) {  
  60.             //System.out.println(searcher.explain(query, scoreDocs[i].doc));  
  61.             int docID = scoreDocs[i].doc;  
  62.             Document document = searcher.doc(docID);  
  63.             String path = document.get("text");  
  64.             System.out.println("text:" + path);  
  65.         }  
  66.     }  
  67. }  

   pharseQuery.add(term),每次都是add到末尾,当然你也可以用add(term,position)明确指定add到哪个位置,示例代码中add了两个Term,则我们的查询短语是dog jumps,他们的间隔为0,然后我们设置slop值为5,

 

第2个索引文档里单词jumps往右移动5次刚好可以得到我们的查询短语dog jumps,因此它符合要求被返回了,而第1个索引文档直接不包含单词dog不符合要求,第3个索引文档需要移动7次才能得到dog jumps,所以最后返回的只有第2个索引文档。

   如果我把代码变一下,改成这样:

   

Java代码   收藏代码
  1. String term1 = "dog";  
  2. String term2 = "jumps";  
  3. PhraseQuery phraseQuery = new PhraseQuery();  
  4. phraseQuery.add(new Term("text",term1),0);  
  5. phraseQuery.add(new Term("text",term2),2);  
  6. phraseQuery.setSlop(6);  
  7.   
  8. TopDocs results = searcher.search(phraseQuery, null100);  

   这时候我们的查询短语就是dog xxx jumps,意思就是我们要查询包含dog和jumps字符的文档而且dog和jumps之间要有一个字符间隔(不包含停用词),这时候我们的slop就要加1了,即我们需要再多移动一次,所以这次slop值应该为6.

 

    PharseQuery下还有一个子类NGramPhraseQuery,这个子类涉及到N-Gram模型,算法之类的我就略过了。

   

   如果你还有什么问题请加我Q-Q:7-3-6-0-3-1-3-0-5,

或者加裙
一起交流学习!

转载:http://iamyida.iteye.com/blog/2195838

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值