您的位置:首页 > 其它

lucene5 构建索引和查询举例

2016-04-29 11:49 225 查看
在使用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)合理运用各种类型,可以达到很好的索引效果。对于数据量比较大的,就不要把索引放到内存中了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: