您的位置:首页 > 其它

如何读取搜索创建的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值就可以显示出你想要的值了

下面通过一段代码展示一下:

[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++){

        }
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: