lucene5 构建索引和查询举例

来源:互联网 发布:hadoop云计算实战 编辑:程序博客网 时间:2024/04/30 16:38

在使用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
原创粉丝点击