Lucene实践之Query
检索过程中可能会面临各种各样的复杂条件检索,今天学习一下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相关推荐
- 理解Lucene中的Query
Query是一个接口,它有很多实现类. QueryParser是Query解析器,用于将一个字符串解析为一个Query对象,这个Query对象可能属于TermQuery,也可能属于PhraseQuer ...
- Lucene基本使用和代码实现
目录 Lucene:全文检索技术 一.Lucene的介绍 1.1背景 1.2优点 1.3Lucene的缺点 1.4全文检索 二.Lucene的基本使用流程 2.1Lucene检索过程 2.2获取文档 ...
- web 信息模糊检索等 Lucene的实现
2019独角兽企业重金招聘Python工程师标准>>> 简介: Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不 ...
- 阿翔编程学-Lucene入门与使用
Lucene入门与使用 本文主要面向具体使用,适用于已熟悉java编程的lucene初学者. 1. Lucene的简介 1.1 Lucene 历史 org.apache.lucene包是纯java语言 ...
- java lucene demo,lucene自带的两个demo的运行测试方法
最近准备做个自己的blog,考虑到对文文章内容的搜索,于是决定通过lucene对文章进行全文搜索.以下是我的学习笔记. 首先学习了中文java上的为自己的系统搞个全文搜索.车东的基于Java的全文索引 ...
- Lucene 基础知识
1. 数据分类 结构化数据: 指具有固定格式或有限长度的数据,如数据库等; 非结构化数据: 指不定长或无固定格式的数据, 如邮件,word 文档等磁盘上的文件; 1.1 非结构化数据查询方法 顺序扫描 ...
- 全文搜索技术—Lucene
1. 内容安排 实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来.还可以根据中文词语进程查询,并且支持多种条件查询. 本案例中的原始内容就是磁盘上的文件 ...
- 关于org.apache.lucene.queryParser.ParseException: Encountered 解决方法
现象: org.apache.lucene.queryParser.ParseException: Encountered "<EOF>" at line 1, col ...
- Lucene教程--维护索引、查询对象和相关度排序
1 索引维护 1.1 添加索引 步骤: 1)创建存放索引的目录Directory 2)创建索引器配置管理类IndexWriterConfig 3)使用索引目录和配置管理类创建索引器 4)使用索引器将D ...
- 初识Lucene.net
最近想提高下自己的能力,也是由于自己的项目中需要用到Lucene,所以开始接触这门富有挑战又充满新奇的技术.. 刚刚开始,只是写了个小小的demo,用了用lucene,确实很好 创建索引 DataTa ...
最新文章
- MySQL优化篇:IN VS EXISTS
- VBS基础篇 - wscript 对象
- 初学者python用哪个版本好-python用哪个版本好
- 数据分析精华经验分享,看看冠军是如何炼成的?
- 9名程序员被抓!这次真的活该.....
- 【JDK】JDK源码分析-HashMap(1)
- 5G领域最权威绿宝书迎来中文版啦!
- 如何做好软件测试管理工作,如何才能做好软件测试工作
- 背景纹理素材|为前景元素添加焦点
- Python3 可变对象VS不可变对象、 对象的赋值、深拷贝VS浅拷贝
- android中bundle的使用
- 计算机模拟学,深度学习是让计算机模拟
- 23计算机考研人第一周反思总结
- html标签-meta
- 异地多活(异地双活)实践经验
- 看过这100个知识点,模电其实也不难
- 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素
- 科普——未知的公共免费WIFI存在的风险及隐患
- 大数据(一)数据采集 3
- IDC许可证是什么,如何申请IDC许可证办理