lucene5 构建索引和查询举例

在使用lucene5构建索引和查询的时候,有很多方法和低版本的不太一样,下面就举例说明一下在lucene5中如何构建索引以及查询:

构建索引:

    public static void main(String[] args) throws IOException {

        // 构建indexwriter

        RAMDirectory directory = new RAMDirectory();

        StandardAnalyzer analyzer = new StandardAnalyzer();

        IndexWriterConfig config = new IndexWriterConfig(analyzer);

        IndexWriter indexWriter = new IndexWriter(directory, config);


        // 构建不同类型的索引

        Document newDoc = new Document();

        // 对于long类型和int类型,如果想在检索时直接按照数值查询出来,那么构建索引的时候要转换成string

        Field longOrIntField = new StringField("longOrIntvalue", "123123123", Store.YES);

        newDoc.add(longOrIntField);

        

        // stringfield用于直接对内容构建索引,不会进行分词

        Field wordField = new StringField("word", "wholeword", Store.NO);

        newDoc.add(wordField);

        

        // textfield用于分词之后构建索引

        Field textField = new TextField("text", "www.suiyuan521.com haha", Store.NO);

        newDoc.add(textField);

        

        // 如果希望某一数据支持排序功能

        Field sortField = new NumericDocValuesField("sortTime", 234242424342342L);

        newDoc.add(sortField);


        // 对于int或者long类型

        Field longField = new LongField("longvalue", 13133L, Store.NO);

        newDoc.add(longField);

        Field intField = new IntField("intvalue", 123, Store.NO);

        newDoc.add(intField);

        

        indexWriter.addDocument(newDoc);

    }


索引查询:

  // 查询对象  此处的indexWriter就是上面的indexWriter

        IndexReader ireader = DirectoryReader.open(indexWriter);

        IndexSearcher isearcher = new IndexSearcher(ireader);

        

        // 构建排序对象  意思是先按照score排序  然后按照sortTime排序

        Sort sort = new Sort(SortField.FIELD_SCORE, new SortField("sortTime", Type.LONG, true));

        

        // 构建query

        BooleanQuery.Builder baseQuery = new BooleanQuery.Builder();

        // 不分词直接检索内容

        Term wordTerm = new Term("word", "wholeword");

        TermQuery wordQuery = new TermQuery(wordTerm);

        baseQuery.add(wordQuery, Occur.MUST);

        

        // 分词检索内容

        QueryParser textParser = new QueryParser("text", analyzer);

        Query textQuery = textParser.parse("suiyuan");

        baseQuery.add(textQuery, Occur.SHOULD);

        

        // 按数值范围检索

        NumericRangeQuery<Long> longRange =

                NumericRangeQuery.newLongRange("longvalue", 12321L, 45678L, true, true);

        baseQuery.add(longRange, Occur.MUST);

        

        TopDocs docs = isearcher.search(baseQuery.build(), 100, sort);

        int totalSize = docs.totalHits;

        for(int i = 0; i < 10; i ++) {

            ScoreDoc scoreDoc = docs.scoreDocs[i];

            System.out.println(scoreDoc.doc);

            System.out.println(scoreDoc.score);

            Document document = isearcher.doc(scoreDoc.doc);

            System.out.println(document.get("Store属性为YES的属性名称"));

        }


使用总结:

(1)lucene用处是构建索引,不要把所有内容的store都设置成yes,这样会占用大把空间。

(2)合理运用各种类型,可以达到很好的索引效果。对于数据量比较大的,就不要把索引放到内存中了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值