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)合理运用各种类型,可以达到很好的索引效果。对于数据量比较大的,就不要把索引放到内存中了。
构建索引:
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)合理运用各种类型,可以达到很好的索引效果。对于数据量比较大的,就不要把索引放到内存中了。
相关文章推荐
- 0429团队准备
- PHP extract() 函数的用法
- 设计模式(七)模板方法模式
- 各种字符集和编码详解
- Apache Rewrite规则详解
- 文章标题
- 日常脚本二——重复数据删除
- 苹果APNs’ device token特性和过期更新
- WisdomPluginFramework框架实际应用中的点点滴滴
- 你们有关注过HTML标签的默认样式和浏览器默认样式吗?
- shell调用sftp实现自动批量上传or下载
- python中使用fork创建新的进程
- Android仿微信底部实现Tab选项卡切换效果
- c# 获取文件路径的几种方法
- 让VIM彻底告别乱码
- WinForm和WPF中注册热键
- 160429、nodejs--Socket.IO即时通讯
- 前端开发知识点
- Android布局的优化
- QT+OpenGL开发实例:扫描线填充算法