检索过程中可能会面临各种各样的复杂条件检索,今天学习一下lucene各种Query,并通过多个Query的合并使用实现多条件的检索。

Game Starts

参考文档

  1) Package org.apache.lucene.search Description

  2) Lucene整理4-各种Query(转)

依赖的jar包

  1)lucene-core.jar

  2)lucene-analyzer-common

  3)lucene-queryParser

主要的类

  1)Term

Term表示的就是一个词,这里的词并不是我们生活中所谓的词语,而是lucene创建索引时所做的分词,使用的分词器不同这里对词的划分也就不同。
例如‘爸爸去哪儿’,我使用IKAnalyzer分词后为‘爸爸’‘去哪儿’,这里我用‘爸爸’‘去哪儿’匹配都可以匹配,但是用‘爸爸去哪儿’‘爸爸去’‘爸’等都是无法匹配的。
Term有三种构造方法。常用的有两种1、public Term(String fld,  BytesRef bytes); 2、public Term(String fld, String text);
注意的是参数不要为空,BytesRef String都是传递的引用,所以应用的对象在后面不要发生改变,话说回来,让String引用的对象发生改变还是挺费劲的。 

  2)TermQuery

TermQuery是最简单最常用的一个Query的实现。TermQuery匹配包含指定的Term的Document。简单的构造方法TermQuery tq = new TermQuery(new Term("fieldName", "term"));匹配分filedName中包含term的,注意是包含,不是完全匹配,想要完全匹配怎么办?构建索引的是对这个field不分词就行了,还是要记住什么是Term.

  3)BooleanQuery

当将多个TermQuery合并到一起时,可以使用BooleanQuery,通过BooleanClause参数决定TermQuery之间的合并关系.BooleanClause有三个值1、MUST 该TermQuery必须满足2、SHOULD 在没有MUST的BooleanQuery中至少要满足最低数目的SHOULD,最低数目可设置3、MUST_NOT TermQuery必须不满足
当然BooleanQuery并不局限于TermQuery的合并,和可以和其他的Query合作。

  4)PhrasesQuery

PhrasesQuery 是另一个常用的Query。匹配多个Term,通过坡度(slop)来指定任意两个指定的Term之间最多可以像个几个Term。MultiPhraseQuery 是一个更常见的PhraseQuery的形式,可以实现更为复杂的Term排列。具体例子【Always Be Coding】会给出。

  5)TermRangeQuery

TermRangeQuery,很明显是按Term的范围来匹配。当然指定的field是可以比较的。特别说明数值类的不可以用这个Query,使用数值类特有的NumericRangeQuery。

  6)NumericRangeQuery

NumericRangeQuery 匹配数值范围。要想使得NumericRangeQuery起作用,构建索引是也要使用数值域(IntField, LongField, FloatField, or DoubleField)

  7)QueryParser

QueryParser是使用特定分词器解析query。将query分成若干个Term,然后去和Document匹配。多个Term之间的关系有点类似于BoolenQuery的 BooleanClause.SHOULD,但是匹配的term数会影响到结果的排序

  8)MultiFieldQueryParser

MultiFieldQueryParser,很明显是同时对多个域进行分析。
MultiFieldQueryParser.parse(Version matchVersion, String[] queries, String[] fields, Analyzer analyzer)
MultiFieldQueryParser.parse(Version matchVersion, String[] queries, String[] fields, BooleanClause.Occur[] flags, Analyzer analyzer)
MultiFieldQueryParser.parse(Version matchVersion, String query, String[] fields, BooleanClause.Occur[] flags, Analyzer analyzer)
其中数组的长度一定要对应好

Always Be Coding

 1 package lucene;
 2
 3 import java.io.File;
 4 import java.io.IOException;
 5
 6 import org.apache.lucene.analysis.Analyzer;
 7 import org.apache.lucene.document.Document;
 8 import org.apache.lucene.index.DirectoryReader;
 9 import org.apache.lucene.index.IndexReader;
10 import org.apache.lucene.index.Term;
11 import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
12 import org.apache.lucene.queryparser.classic.ParseException;
13 import org.apache.lucene.queryparser.classic.QueryParser;
14 import org.apache.lucene.search.BooleanClause;
15 import org.apache.lucene.search.BooleanClause.Occur;
16 import org.apache.lucene.search.BooleanQuery;
17 import org.apache.lucene.search.IndexSearcher;
18 import org.apache.lucene.search.MultiPhraseQuery;
19 import org.apache.lucene.search.NumericRangeQuery;
20 import org.apache.lucene.search.PhraseQuery;
21 import org.apache.lucene.search.Query;
22 import org.apache.lucene.search.ScoreDoc;
23 import org.apache.lucene.search.TermQuery;
24 import org.apache.lucene.search.TermRangeQuery;
25 import org.apache.lucene.search.TopDocs;
26 import org.apache.lucene.store.FSDirectory;
27 import org.apache.lucene.util.BytesRef;
28 import org.apache.lucene.util.Version;
29 import org.wltea.analyzer.lucene.IKAnalyzer;
30
31 public class Searcher {
32     public static void main(String[] args) throws IOException, ParseException {
33         IndexSearcher indexSearcher;
34         Analyzer anlyzer = new IKAnalyzer(true);;
35         long start = System.currentTimeMillis();
36         IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("/home/erbin/Documents/data/index")));
37         indexSearcher = new IndexSearcher(indexReader);
38         BooleanQuery booleanQuery = new BooleanQuery();
39         QueryParser parser = new QueryParser(Version.LUCENE_46, "title", anlyzer);
40         Query query = parser.parse("爸爸");
41         booleanQuery.add(query, Occur.MUST);
42         TermQuery termQuery = new TermQuery(new Term("city","北京"));
43         booleanQuery.add(termQuery, Occur.MUST);
44         PhraseQuery phraseQuery = new PhraseQuery();
45         phraseQuery.setSlop(1);
46         phraseQuery.add(new Term("name","爸爸"));
47         phraseQuery.add(new Term("name","妈妈"));
48         booleanQuery.add(phraseQuery, Occur.MUST_NOT);
49         MultiPhraseQuery multiPhrasequery = new MultiPhraseQuery();
50         multiPhrasequery.add(new Term("name","爸爸"));//前缀
51         Term t1 = new Term("name", "去哪儿");//爸爸去哪儿 或者 爸爸ni
52         Term t2 = new Term("name", "到哪儿");
53         multiPhrasequery.add(new Term[]{t1, t2});//组成:爸爸去哪儿,爸爸到哪儿
54         booleanQuery.add(multiPhrasequery, Occur.SHOULD);
55         Query numericRangeQuery = NumericRangeQuery.newIntRange("name", 0, 4, false, false);
56         booleanQuery.add(numericRangeQuery, Occur.SHOULD);
57         Query termRangeQuery = new TermRangeQuery("name", new BytesRef("20100101"), new BytesRef("20101231"), false, false);
58         booleanQuery.add(termRangeQuery, Occur.SHOULD);
59         Query multiFieldQueryParser = MultiFieldQueryParser.parse(Version.LUCENE_46,                                             "爸爸",                                             new String[]{"name","content"},                                             new BooleanClause.Occur[]{Occur.MUST,Occur.MUST_NOT} ,                                            anlyzer);
60         booleanQuery.add(multiFieldQueryParser, Occur.SHOULD);
61         TopDocs results = indexSearcher.search(booleanQuery, 10);
62         ScoreDoc[] hits = results.scoreDocs;
63         int totalHits = results.totalHits;
64         for(int i = 0; i < totalHits; i++) {
65             Document doc = indexSearcher.doc(hits[i].doc);
66             System.out.println("["+doc.get("title")+"]");
67         }
68         long end = System.currentTimeMillis();
69         System.out.println(end - start);
70     }
71 }

TO BE CONTINUED……

转载于:https://www.cnblogs.com/erbin/p/3928281.html

Lucene实践之Query相关推荐

  1. 理解Lucene中的Query

    Query是一个接口,它有很多实现类. QueryParser是Query解析器,用于将一个字符串解析为一个Query对象,这个Query对象可能属于TermQuery,也可能属于PhraseQuer ...

  2. Lucene基本使用和代码实现

    目录 Lucene:全文检索技术 一.Lucene的介绍 1.1背景 1.2优点 1.3Lucene的缺点 1.4全文检索 二.Lucene的基本使用流程 2.1Lucene检索过程 2.2获取文档 ...

  3. web 信息模糊检索等 Lucene的实现

    2019独角兽企业重金招聘Python工程师标准>>> 简介: Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不 ...

  4. 阿翔编程学-Lucene入门与使用

    Lucene入门与使用 本文主要面向具体使用,适用于已熟悉java编程的lucene初学者. 1. Lucene的简介 1.1 Lucene 历史 org.apache.lucene包是纯java语言 ...

  5. java lucene demo,lucene自带的两个demo的运行测试方法

    最近准备做个自己的blog,考虑到对文文章内容的搜索,于是决定通过lucene对文章进行全文搜索.以下是我的学习笔记. 首先学习了中文java上的为自己的系统搞个全文搜索.车东的基于Java的全文索引 ...

  6. Lucene 基础知识

    1. 数据分类 结构化数据: 指具有固定格式或有限长度的数据,如数据库等; 非结构化数据: 指不定长或无固定格式的数据, 如邮件,word 文档等磁盘上的文件; 1.1 非结构化数据查询方法 顺序扫描 ...

  7. 全文搜索技术—Lucene

    1.   内容安排 实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来.还可以根据中文词语进程查询,并且支持多种条件查询. 本案例中的原始内容就是磁盘上的文件 ...

  8. 关于org.apache.lucene.queryParser.ParseException: Encountered 解决方法

    现象: org.apache.lucene.queryParser.ParseException: Encountered "<EOF>" at line 1, col ...

  9. Lucene教程--维护索引、查询对象和相关度排序

    1 索引维护 1.1 添加索引 步骤: 1)创建存放索引的目录Directory 2)创建索引器配置管理类IndexWriterConfig 3)使用索引目录和配置管理类创建索引器 4)使用索引器将D ...

  10. 初识Lucene.net

    最近想提高下自己的能力,也是由于自己的项目中需要用到Lucene,所以开始接触这门富有挑战又充满新奇的技术.. 刚刚开始,只是写了个小小的demo,用了用lucene,确实很好 创建索引 DataTa ...

最新文章

  1. MySQL优化篇:IN VS EXISTS
  2. VBS基础篇 - wscript 对象
  3. 初学者python用哪个版本好-python用哪个版本好
  4. 数据分析精华经验分享,看看冠军是如何炼成的?
  5. 9名程序员被抓!这次真的活该.....
  6. 【JDK】JDK源码分析-HashMap(1)
  7. 5G领域最权威绿宝书迎来中文版啦!
  8. 如何做好软件测试管理工作,如何才能做好软件测试工作
  9. 背景纹理素材|为前景元素添加焦点
  10. Python3 可变对象VS不可变对象、 对象的赋值、深拷贝VS浅拷贝
  11. android中bundle的使用
  12. 计算机模拟学,深度学习是让计算机模拟
  13. 23计算机考研人第一周反思总结
  14. html标签-meta
  15. 异地多活(异地双活)实践经验
  16. 看过这100个知识点,模电其实也不难
  17. 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素
  18. 科普——未知的公共免费WIFI存在的风险及隐患
  19. 大数据(一)数据采集 3
  20. IDC许可证是什么,如何申请IDC许可证办理

热门文章

  1. 去掉serialVersionUID的警告
  2. 吃自己的狗食,用自己的产品——再谈华为芯片
  3. gstreamer的插件如何复制数据
  4. gstreamer向appsrc发送数据的代码
  5. 安卓双进程保活的代码
  6. ImportError: cannot import name 'imresize'
  7. java鼠标左键拖拽事件_探索神秘的js拖拽事件
  8. VC++ 只运行一个程序实例
  9. byte数组转字符串_字符串性能优化不容小觑
  10. 后台填充_单元格噩梦终于有救?500多行隔行填充,我就两步!