如何读取搜索创建的Lucene索引内容
2016-01-28 17:01
513 查看
今天下午也总结了下Lucene索引读取搜索的过程。
先总结一下我所用的搜索索引过程中常用的API:
IndexSearcher:它是用来在建立好的索引上进行搜索的,它只能以只读(IndexReader)的方式打开一个索引(这个关系到你怎么打开关联到搜索索引上)。
Search:它是负责查询用的,传入的参数不同查询出的返回值也不同。
Term:搜索的基本单元,它里面放的两个参数分别是要搜索字段的名称和字段的具体值。
Query:是一个抽象类,这个类的目的是将查询的语句封装成Lucene能够识别的语句,它的子类较多。
TermQuery:是Query的子类。里面放Term。
BooleanQuery:也是Query的子类,它可以把各种query添加进去,变注明其逻辑关系(MUST(与),SHOULD(或),MUST_NOT(非))
MUST和MUST:取得连个查询子句的交集。
MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。
MUST_NOT和MUST_NOT:无意义,检索无结果。
SHOULD与MUST、SHOULD与MUST_NOT:
SHOULD与MUST连用时,无意义,结果为MUST子句的检索结果。
SHOULD与MUST_NOT连用时, SHOULD功能同MUST,相当于MUST和 MUST NOT的检索结果。
SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。
RangeQuery范围搜索
PrefixQuery 前缀搜索
FuzzyQuery模糊搜索
WildcardQuery通配符搜索(*代表0到多个字符,?代表一个单一的字符)
SpanQuery跨度搜索
____RegexQuery正则表达式搜索
____MultiFieldQueryParser 多域搜索
____MultiSearcher多索引搜索
____ParallelMultiSearcher多线程搜索
PhraseQuery短语搜索
TopDocs:封装查询出的结果。
Document:通过它的get方法输入你要查询的key值,就可以获得你想要查找内容的结果。
总结一下我认为的搜索索引内容的过程,大致分为6步:
1.得到并打开索引位置(IndexSearch、IndexReader);
2.获得你输入的查询的关键字(TermQuery,BooleanQuery);
3.通过search查询2中的关键字,返回查询的值
4.遍历查询的值
5.获得查询doc方法,返回Document类
6.通过Document类的get方法,放入建立索引时的key值就可以显示出你想要的值了
下面通过一段代码展示一下:
先总结一下我所用的搜索索引过程中常用的API:
IndexSearcher:它是用来在建立好的索引上进行搜索的,它只能以只读(IndexReader)的方式打开一个索引(这个关系到你怎么打开关联到搜索索引上)。
Search:它是负责查询用的,传入的参数不同查询出的返回值也不同。
Term:搜索的基本单元,它里面放的两个参数分别是要搜索字段的名称和字段的具体值。
Query:是一个抽象类,这个类的目的是将查询的语句封装成Lucene能够识别的语句,它的子类较多。
TermQuery:是Query的子类。里面放Term。
BooleanQuery:也是Query的子类,它可以把各种query添加进去,变注明其逻辑关系(MUST(与),SHOULD(或),MUST_NOT(非))
MUST和MUST:取得连个查询子句的交集。
MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。
MUST_NOT和MUST_NOT:无意义,检索无结果。
SHOULD与MUST、SHOULD与MUST_NOT:
SHOULD与MUST连用时,无意义,结果为MUST子句的检索结果。
SHOULD与MUST_NOT连用时, SHOULD功能同MUST,相当于MUST和 MUST NOT的检索结果。
SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。
RangeQuery范围搜索
PrefixQuery 前缀搜索
FuzzyQuery模糊搜索
WildcardQuery通配符搜索(*代表0到多个字符,?代表一个单一的字符)
SpanQuery跨度搜索
____RegexQuery正则表达式搜索
____MultiFieldQueryParser 多域搜索
____MultiSearcher多索引搜索
____ParallelMultiSearcher多线程搜索
PhraseQuery短语搜索
TopDocs:封装查询出的结果。
Document:通过它的get方法输入你要查询的key值,就可以获得你想要查找内容的结果。
总结一下我认为的搜索索引内容的过程,大致分为6步:
1.得到并打开索引位置(IndexSearch、IndexReader);
2.获得你输入的查询的关键字(TermQuery,BooleanQuery);
3.通过search查询2中的关键字,返回查询的值
4.遍历查询的值
5.获得查询doc方法,返回Document类
6.通过Document类的get方法,放入建立索引时的key值就可以显示出你想要的值了
下面通过一段代码展示一下:
[code]public class myIndexSearcher extends Activity{ BooleanQuery myBooleanQuery=new BooleanQuery(); private IndexSearcher mIndexSearcher; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); if(mIndexSearcher==null){ try { getIndexSearcher(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void getIndexSearcher() throws IOException { // TODO Auto-generated method stub mIndexSearcher = IndexSearcherUtil.getInstance().getCatIndexSearcher(); } //显示出查询的相关字 public void showData(String s) throws IOException{ TermQuery provnumber=new TermQuery(new Term("provnumber","-1")); myBooleanQuery.add(provnumber, Occur.MUST_NOT); //2 BooleanQuery myBooleanQuery2=new BooleanQuery(); TermQuery provtext=new TermQuery(new Term("provtext", s)); myBooleanQuery2.add(provtext,Occur.SHOULD); TermQuery keywordm=new TermQuery(new Term("mkeyword", s)); myBooleanQuery2.add(keywordm,Occur.SHOULD); myBooleanQuery.add(myBooleanQuery2,Occur.MUST); TermQuery hycode=new TermQuery(new Term("hycode", "H29")); myBooleanQuery.add(hycode,Occur.MUST); BooleanQuery myBooleanQuery3=new BooleanQuery(); TermQuery hwtype=new TermQuery(new Term("hwtype", "Alaw"));//类型确定 哪个表 myBooleanQuery3.add(hwtype,Occur.MUST); SortField msField=new SortField("fprovinid", SortField.INT); setDate(myBooleanQuery3,msField); } private void setDate(BooleanQuery myBooleanQuery, SortField msField) throws IOException { // TODO Auto-generated method stub getList(myBooleanQuery,msField); } private void getList(BooleanQuery myBooleanQuery2, SortField msField) throws IOException { // 放catinid的list集合 List<String> mCatinidList=new ArrayList<String>(); //排序 Sort sort=new Sort(msField); int count = mIndexSearcher.search(myBooleanQuery2, 1).totalHits; TopDocs hits = mIndexSearcher.search(myBooleanQuery2, count, sort); for(int i=0;i<count;i++){ Document document = mIndexSearcher.doc(hits.scoreDocs[i].doc); //通过get获得文档中一个字段对应的文本,获取的这个字段要与建议索引时的字段一样 int mCatInId = Integer.parseInt(document.get("catinid")); int mfprovinid = Integer.parseInt(document.get("fprovinid")); String mCatName=document.get("catnames"); String mprovtext = document.get("provtext"); String hycode = document.get("hycode"); String mhwtype = document.get("hwtype"); String keywordm = document.get("mkeyword"); String keywordz = document.get("zkeyword"); String deptnames = document.get("deptnames"); //这个是将查询到的信息显示出来 mCatinidList.add("catinid="+mCatInId+ " ; " +"catnames="+mCatName+" ; "+" fprovinid = " + mfprovinid + " ; " + " deptnames = " + deptnames + " ; " + "hycode = " + hycode + " ; " + "content = " + mprovtext + " ; " + "hwtype =" + mhwtype + " ; " + "mkeyword =" + keywordm + " ; " + "zkeyword =" + keywordz); } setTextViewDate(mCatinidList); } private void setTextViewDate(List<String> mCatinidList) { // TODO Auto-generated method stub for(int i=0; i<mCatinidList.size();i++){ } } }
相关文章推荐
- MVP使用中不好的味道
- POJ2763 Housewife Wind
- 获得并设置textview的颜色,getcolor已过时的替代用法
- Centos升级gcc4.4.7升级gcc4.8手记
- Android多渠道打包
- 调整进程优先级
- 解决Cannot change version of project facet Dynamic web module to 2.5
- 去雾算法相关资源
- 关于APP接口防止抓包问题
- 协程学习
- CentOS下使用SWIG为PHP53开发扩展
- 101. Symmetric Tree
- MAC的下载工具
- Oracle循环语句
- Eclipse中lib 和 libs 目录的区别 和加载jar注意的一些事项
- DELL 服务器在LINUX下查看阵列状态命令
- leetcode MergeTwoLists
- Emmet基本使用方法
- 第0章:准备环境
- 字符数组与字符指针的区别