`
landows
  • 浏览: 18215 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lucene 中一个Filed中包含多值的范围查询

 
阅读更多
直接上代码:

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();
		}
	}
}


分享到:
评论

相关推荐

    Lucene时间区间搜索

    总之,Lucene在C#中的时间区间搜索是通过构建和执行RangeQuery来实现的,这涉及到索引构建、查询解析、时间值的转换和比较等多个环节。合理地利用这些技术,可以有效地提升数据检索的效率和准确性。在实际应用中,还...

    lucene 多字段查询+文字高亮显示

    本话题聚焦于“Lucene多字段查询”和“文字高亮显示”,这两个特性在信息检索和数据挖掘中具有广泛应用。 首先,让我们深入理解“Lucene多字段查询”。在信息检索系统中,用户可能希望根据多个字段来过滤和排序结果...

    Lucene3.0之查询类型详解

    在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较低。 - **索引查询**:基于预...

    Lucene索引和查询

    本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行索引创建和查询操作。 首先,我们需要了解Lucene的基本概念。Lucene的核心思想是将文本数据转换为结构化的索引,以便于快速查找相关文档。这个过程...

    Lucene建立索引及查询包含“java”关键字 示例代码

    这个示例代码将向我们展示如何使用Lucene来创建一个索引,并执行一个包含"java"关键字的查询。 首先,我们需要导入必要的Lucene库,包括核心类库和其他可能需要的模块,例如分析器(Analyzer)和文档(Document)...

    Lucene在web项目中的应用

    - **文档(Document)**: 在Lucene中,每个要搜索的信息被视为一个文档,可以包含多个字段(Field),如标题、内容、作者等。 - **字段(Field)**: 文档的组成部分,每个字段有特定的类型,如文本、日期或数值。 - ...

    lucene的查询语法事例

    - **范围查询 (Range Query)**:指定一个范围,如`date:[2020 TO 2022]`,找出日期在2020年至2022年之间的文档。 ### 2. 操作符与逻辑查询 Lucene支持以下操作符来进行逻辑组合: - **AND (默认操作)**:默认情况...

    lucene.NET 中文分词

    - **缓存策略**:合理使用Lucene.NET的缓存机制,如TermVector缓存,可以提升查询性能。 总的来说,Lucene.NET在中文分词和高亮显示方面的应用需要结合合适的分词器,并进行适当的配置和优化。开发者可以根据实际...

    Lucene中的FST算法描述

    Lucene中的FST数据结构主要包括以下几个部分: 1. FSTbytes:这是一个字节数组,存储了完整的FST图信息。通过这个数组,可以重建FST图,从而快速定位到term在磁盘上的存储位置。 2. FSTNode:表示FST图中的节点。...

    lucene表达式处理查询

    在Lucene中,表达式查询是一种高级查询方式,允许用户通过特定的语法构造复杂的查询条件。本篇文章将深入探讨Lucene表达式处理查询的原理、语法及示例。 ### 1. Lucene表达式查询基础 Lucene表达式查询是基于...

    lucene创建修改删除组合条件查询

    在本主题中,我们将深入探讨如何使用Lucene进行创建、删除、修改和组合条件查询,以及如何实现类似MySQL中的LIKE、IN、OR和时间范围条件查询。 首先,**创建索引**是使用Lucene的第一步。创建索引涉及到读取数据源...

    Lucene.net中文帮助文档

    3. **文档和字段(Document and Fields)**:在Lucene.NET中,每个文档由一个或多个字段组成,每个字段都有特定的属性,如是否可被索引、是否存储原始值等。 4. **查询构造(Query Parsing)**:Lucene.NET支持多种...

    lucene facet查询示例

    本示例将深入探讨如何在Lucene中实现facet查询,包括区间查询和多维度查询,以及关键概念——key-field-value模型。 **一、Lucene Facet的概念** Facets是信息组织的一种方法,类似于图书馆的分类标签。在搜索结果...

    lucene中的SpanQuery和PhraseQuery详解(有图示)

    例如,在上面的示例程序中,我们创建了一个 SpanTermQuery 对象 quick,用于查询字段 "f" 中包含词项 "quick" 的文档。 2. SpanNearQuery SpanNearQuery是一个近似查询,用于查询指定字段中包含某些词项的文档,...

    lucene查询工具类和IndexSearcher分页查询示例

    它们允许合并多个`IndexReader`,这样就可以在一个查询中同时搜索多个索引。 总之,利用Lucene的`IndexSearcher`和适当的分页策略,我们可以高效地处理大量数据的搜索请求。这个过程不仅提高了用户体验,也优化了...

    Lucene示例 BM25相似度计算

    在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...

    模糊查询-lucene-IKAnalyzer

    在Lucene中,我们可以使用`QueryParser`类来构造模糊查询的`Query`对象,然后通过`IndexSearcher`执行这个查询,获取匹配的结果。 在提供的压缩包文件中,"src"目录下可能包含了实现上述功能的Java源代码。这些代码...

    lucene实例lucene实例

    1. 文档(Document):在Lucene中,文档是信息的基本单位,可以理解为数据库中的一条记录,包含多个字段(Field)。 2. 字段(Field):文档由多个字段组成,每个字段都有特定的含义,如标题(Title)、内容...

    lucene 全包 包括源码

    5. 文档处理(Document):Document类代表索引中的单个记录,可以包含多个Field,每个Field有不同属性(如是否存储、是否可搜索等)。Field和Document的处理贯穿于整个索引和搜索流程。 除了核心模块,Lucene还提供...

    lucene相关jar+查询分析器jar

    1. **Lucene的组件和工作流程**:Lucene主要包括索引和查询两个主要阶段。在索引阶段,它将文本数据转换成倒排索引,这是一个能够快速查找包含特定词汇的文档的数据结构。在查询阶段,用户输入的查询会被解析,然后...

Global site tag (gtag.js) - Google Analytics