`

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表达式处理查询

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

    Lucene中的FST算法描述

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

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

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

    模糊查询-lucene-IKAnalyzer

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

    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 全包 包括源码

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

    lucene相关jar+查询分析器jar

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

    lucene实现索引查询

    你可以添加多个Field对象到Document中,每个Field对应记录的一个属性。 5. **创建Field对象**:Field是文档中的一个字段,具有名称和值。例如,`Field.Store.YES`表示该字段会被存储,以便在查询结果中返回;`Field...

Global site tag (gtag.js) - Google Analytics