如何读取搜索创建的Lucene索引内容

今天下午也总结了下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

http://edu.csdn.net/course/play/6409/123752

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值