- 浏览: 199678 次
文章分类
最新评论
-
code_xiaoke:
session可是有30分钟有效期的还有如果在分布式的环境下 ...
Java Web 用户登陆示例代码 -
xul0038:
http://www.baidu.com
Java Web 用户登陆示例代码 -
16866:
非常棒,配置信息呢
Nginx负载均衡 -
开发小菜:
什么意思,没明白?能不能写一个例子
JS 实现DIV随浏览器窗口大小变化
package tools.lucene;
import java.io.File;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.PerFieldAnalyzerWrapper;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;
public class LuceneIndexWriter {
public static String index_path="D:\\ix";
public static String index_path2="D:\\ix2";
public static void main(String[]args) throws Exception{
createMultiValueIndex();
//createIndex();
//词范围查询,但需要将价格字符串格式化,按位数对此,前面补0
//TermRangeQuery trquery = new TermRangeQuery("price", "088", "100",true, true);
//按数字类型范围查询
Query trquery = NumericRangeQuery.newIntRange("price", 1, 99,true, true);
//IndexReader indexReader = IndexReader.open(FSDirectory.open(new File(index_path)));
IndexReader indexReader = IndexReader.open(FSDirectory.open(new File(index_path2)));
Searcher searcher = new IndexSearcher(indexReader);
TopDocs topDocs = searcher.search(trquery,100);
for (ScoreDoc hits:topDocs.scoreDocs){
Document doc = searcher.doc(hits.doc);
System.out.println("doc = "+doc.getValues("price"));
}
}
/**
* document包含多个同名price Filed
*/
private static void createMultiValueIndex() {
Analyzer analyzer = new IKAnalyzer();
PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = new PerFieldAnalyzerWrapper(analyzer);
try {
//perFieldAnalyzerWrapper.addAnalyzer("price", new WhitespaceAnalyzer());
IndexWriter writer = new IndexWriter(FSDirectory.open(new File(index_path2)), perFieldAnalyzerWrapper, true,IndexWriter.MaxFieldLength.LIMITED);
Document doc = new Document();000
doc.add(new Field("hotelName", "test2", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(100));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(200));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(300));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test3", Field.Store.YES, Field.Index.ANALYZED));
//增加多个同名字段(price)
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(99));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(213));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test1", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(400));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(200));
writer.addDocument(doc);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* price中价格按照空格分隔,保存到一个field
*/
private static void createIndex() {
Analyzer analyzer = new IKAnalyzer();
PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = new PerFieldAnalyzerWrapper(analyzer);
try {
perFieldAnalyzerWrapper.addAnalyzer("price", new WhitespaceAnalyzer());
IndexWriter writer = new IndexWriter(FSDirectory.open(new File(index_path)), perFieldAnalyzerWrapper, true,IndexWriter.MaxFieldLength.LIMITED);
Document doc = new Document();
doc.add(new Field("hotelName", "test2", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price", "100 200 300", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test1", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price", "400 500", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test8", Field.Store.YES, Field.Index.ANALYZED));
//price字段以空格分隔,使用WhitespaceAnalyzer分词
doc.add(new Field("price", "213 588 099 ", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test3", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price", "600 700 518", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test4", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price", "200 228 518", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.File;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.PerFieldAnalyzerWrapper;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;
public class LuceneIndexWriter {
public static String index_path="D:\\ix";
public static String index_path2="D:\\ix2";
public static void main(String[]args) throws Exception{
createMultiValueIndex();
//createIndex();
//词范围查询,但需要将价格字符串格式化,按位数对此,前面补0
//TermRangeQuery trquery = new TermRangeQuery("price", "088", "100",true, true);
//按数字类型范围查询
Query trquery = NumericRangeQuery.newIntRange("price", 1, 99,true, true);
//IndexReader indexReader = IndexReader.open(FSDirectory.open(new File(index_path)));
IndexReader indexReader = IndexReader.open(FSDirectory.open(new File(index_path2)));
Searcher searcher = new IndexSearcher(indexReader);
TopDocs topDocs = searcher.search(trquery,100);
for (ScoreDoc hits:topDocs.scoreDocs){
Document doc = searcher.doc(hits.doc);
System.out.println("doc = "+doc.getValues("price"));
}
}
/**
* document包含多个同名price Filed
*/
private static void createMultiValueIndex() {
Analyzer analyzer = new IKAnalyzer();
PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = new PerFieldAnalyzerWrapper(analyzer);
try {
//perFieldAnalyzerWrapper.addAnalyzer("price", new WhitespaceAnalyzer());
IndexWriter writer = new IndexWriter(FSDirectory.open(new File(index_path2)), perFieldAnalyzerWrapper, true,IndexWriter.MaxFieldLength.LIMITED);
Document doc = new Document();000
doc.add(new Field("hotelName", "test2", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(100));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(200));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(300));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test3", Field.Store.YES, Field.Index.ANALYZED));
//增加多个同名字段(price)
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(99));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(213));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test1", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(400));
doc.add(new NumericField("price", Field.Store.YES, true).setIntValue(200));
writer.addDocument(doc);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* price中价格按照空格分隔,保存到一个field
*/
private static void createIndex() {
Analyzer analyzer = new IKAnalyzer();
PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = new PerFieldAnalyzerWrapper(analyzer);
try {
perFieldAnalyzerWrapper.addAnalyzer("price", new WhitespaceAnalyzer());
IndexWriter writer = new IndexWriter(FSDirectory.open(new File(index_path)), perFieldAnalyzerWrapper, true,IndexWriter.MaxFieldLength.LIMITED);
Document doc = new Document();
doc.add(new Field("hotelName", "test2", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price", "100 200 300", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test1", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price", "400 500", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test8", Field.Store.YES, Field.Index.ANALYZED));
//price字段以空格分隔,使用WhitespaceAnalyzer分词
doc.add(new Field("price", "213 588 099 ", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test3", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price", "600 700 518", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add(new Field("hotelName", "test4", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price", "200 228 518", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
发表评论
-
java实现动态切换上网IP (ADSL拨号上网) java开发
2013-04-24 10:06 1289动态切换IP的实现主是也由Windows的rasdial命令提 ... -
JAVA字符串处理函数
2013-04-12 09:21 1122Java中的字符串也是一连串的字符。但是与许多其他的计算机语 ... -
(转)Lucene打分规则与Similarity模块详解
2013-02-06 14:08 1198搜索排序结果的控制 Lu ... -
Compass将lucene、Spring、Hibernate三者结合
2013-02-01 11:02 1677版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声 ... -
Lucene3.0详解
2013-02-01 10:57 1407★第一部分:概述 1. 我 ... -
Java Web 用户登陆示例代码
2013-02-01 09:56 58107实现功能: 1、用户登陆、注销 2、利用session记 ... -
Java对数函数及Java对数运算
2013-02-01 09:47 6797Java对数函数的计算方法非常有问题,然而在API中却有惊人 ... -
Lucene为不同字段指定不同分词器(转)
2013-01-31 17:34 3455在lucene使用过程中,如 ... -
域名管理与解析原理 — 《Java邮件开发详解》读书笔记
2013-01-31 14:56 1701一 基本概念 1. 域名:域名是由圆点分开一串单词或缩写组 ... -
优秀的Java工程师需要掌握的10项技能
2013-01-31 14:04 1848编程专业相对于计算机领域其他专业来讲,是一门比较难以修炼的专业 ... -
Web开发入门不得不看
2013-01-28 17:31 1032如今,各种互联网的Web ... -
MVC框架的映射和解耦
2013-01-25 21:37 831最近在写一个业务上用到的框架,回想起接触过的一些MVC框架, ... -
JAVA发送EMAIL的例子
2013-07-09 09:44 902import javax.mail.*; ... -
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎
2012-11-19 09:55 1384前两天看到了一个中国新闻网,这个网站的搜索form的actio ... -
Lucene多字段搜索
2012-11-19 09:53 1030最近在学习Lucene的过程中遇到了需要多域搜索并排序的问题, ... -
lucene之sort
2012-11-16 15:06 1088package cn.zqh.lucene.sort; im ... -
Nginx负载均衡
2012-11-16 11:45 7655最近迷上了Nginx,真实麻雀虽小,五脏俱全..功能实在强大. ... -
Lucene相关度排序的调整
2012-11-16 11:38 1728Lucene的搜索结果默认按 ... -
HashSet重复元素判断
2012-10-15 16:37 9139HashSet不能添加重复的元素,当调用add(Object) ... -
JAVA提高教程(2)-认识Set集合之HashSet
2012-10-09 09:44 972集合在Java里面的作用非 ...
相关推荐
总之,Lucene在C#中的时间区间搜索是通过构建和执行RangeQuery来实现的,这涉及到索引构建、查询解析、时间值的转换和比较等多个环节。合理地利用这些技术,可以有效地提升数据检索的效率和准确性。在实际应用中,还...
本话题聚焦于“Lucene多字段查询”和“文字高亮显示”,这两个特性在信息检索和数据挖掘中具有广泛应用。 首先,让我们深入理解“Lucene多字段查询”。在信息检索系统中,用户可能希望根据多个字段来过滤和排序结果...
在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较低。 - **索引查询**:基于预...
本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行索引创建和查询操作。 首先,我们需要了解Lucene的基本概念。Lucene的核心思想是将文本数据转换为结构化的索引,以便于快速查找相关文档。这个过程...
这个示例代码将向我们展示如何使用Lucene来创建一个索引,并执行一个包含"java"关键字的查询。 首先,我们需要导入必要的Lucene库,包括核心类库和其他可能需要的模块,例如分析器(Analyzer)和文档(Document)...
- **文档(Document)**: 在Lucene中,每个要搜索的信息被视为一个文档,可以包含多个字段(Field),如标题、内容、作者等。 - **字段(Field)**: 文档的组成部分,每个字段有特定的类型,如文本、日期或数值。 - ...
- **范围查询 (Range Query)**:指定一个范围,如`date:[2020 TO 2022]`,找出日期在2020年至2022年之间的文档。 ### 2. 操作符与逻辑查询 Lucene支持以下操作符来进行逻辑组合: - **AND (默认操作)**:默认情况...
- **缓存策略**:合理使用Lucene.NET的缓存机制,如TermVector缓存,可以提升查询性能。 总的来说,Lucene.NET在中文分词和高亮显示方面的应用需要结合合适的分词器,并进行适当的配置和优化。开发者可以根据实际...
在Lucene中,表达式查询是一种高级查询方式,允许用户通过特定的语法构造复杂的查询条件。本篇文章将深入探讨Lucene表达式处理查询的原理、语法及示例。 ### 1. Lucene表达式查询基础 Lucene表达式查询是基于...
Lucene中的FST数据结构主要包括以下几个部分: 1. FSTbytes:这是一个字节数组,存储了完整的FST图信息。通过这个数组,可以重建FST图,从而快速定位到term在磁盘上的存储位置。 2. FSTNode:表示FST图中的节点。...
在本主题中,我们将深入探讨如何使用Lucene进行创建、删除、修改和组合条件查询,以及如何实现类似MySQL中的LIKE、IN、OR和时间范围条件查询。 首先,**创建索引**是使用Lucene的第一步。创建索引涉及到读取数据源...
在Lucene中,我们可以使用`QueryParser`类来构造模糊查询的`Query`对象,然后通过`IndexSearcher`执行这个查询,获取匹配的结果。 在提供的压缩包文件中,"src"目录下可能包含了实现上述功能的Java源代码。这些代码...
3. **文档和字段(Document and Fields)**:在Lucene.NET中,每个文档由一个或多个字段组成,每个字段都有特定的属性,如是否可被索引、是否存储原始值等。 4. **查询构造(Query Parsing)**:Lucene.NET支持多种...
本示例将深入探讨如何在Lucene中实现facet查询,包括区间查询和多维度查询,以及关键概念——key-field-value模型。 **一、Lucene Facet的概念** Facets是信息组织的一种方法,类似于图书馆的分类标签。在搜索结果...
例如,在上面的示例程序中,我们创建了一个 SpanTermQuery 对象 quick,用于查询字段 "f" 中包含词项 "quick" 的文档。 2. SpanNearQuery SpanNearQuery是一个近似查询,用于查询指定字段中包含某些词项的文档,...
它们允许合并多个`IndexReader`,这样就可以在一个查询中同时搜索多个索引。 总之,利用Lucene的`IndexSearcher`和适当的分页策略,我们可以高效地处理大量数据的搜索请求。这个过程不仅提高了用户体验,也优化了...
在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...
5. 文档处理(Document):Document类代表索引中的单个记录,可以包含多个Field,每个Field有不同属性(如是否存储、是否可搜索等)。Field和Document的处理贯穿于整个索引和搜索流程。 除了核心模块,Lucene还提供...
1. **Lucene的组件和工作流程**:Lucene主要包括索引和查询两个主要阶段。在索引阶段,它将文本数据转换成倒排索引,这是一个能够快速查找包含特定词汇的文档的数据结构。在查询阶段,用户输入的查询会被解析,然后...
你可以添加多个Field对象到Document中,每个Field对应记录的一个属性。 5. **创建Field对象**:Field是文档中的一个字段,具有名称和值。例如,`Field.Store.YES`表示该字段会被存储,以便在查询结果中返回;`Field...