今天下午也总结了下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值就可以显示出你想要的值了
下面通过一段代码展示一下:
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++){
}
}
}
《Android版本更新、热更新》系列课程视频
版本更新6.0,7.0统统搞定!!
热修复不在麻烦,再也不用担心上线后出bug!!
http://edu.csdn.net/course/detail/6523
http://edu.csdn.net/course/play/6523/131198
《Kotlin语法基础到实战开发》系列课程视频
http://edu.csdn.net/course/detail/6409?locationNum=7&fps=1&ref=srch&loc=1