`
jolestar
  • 浏览: 197220 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene范围查询(RangeQuery)的几个问题

阅读更多

对要进行范围查询(RangeQuery)的字段 创建索引的时候要按照 储存 不分词 的方式创建索引。

 

new Field(name, value, Field.Store.YES, Field.Index.UN_TOKENIZED);

 

1.数字的范围查询

对数字进行范围查询,必须先把数字格式化为一样长度的字符串。位数不够的在前面补零。

如:

NumberFormat format = NumberFormat.getIntegerInstance();
//设置数字的位数 由实际情况的最大数字决定
format.setMinimumIntegerDigits(6);
//是否按每三位隔开,如:1234567 将被格式化为 1,234,567。在这里选择 否
format.setGroupingUsed(false); 

format.format(number);


 

这样 1 将被格式化为 000001

 

查询的时候也必须补零。

 

查询语法: fieldName:[000001 TO 000100]

 

演示:http://so.1ting.com/singer.do?q=singerIdRange%3A[000001+TO+000100]&sort=singerId

 

2:日期范围查询

 

日期范围查询必须需要用lucene的时间转换工具类(DateTools )的

static String dateToString (Date date, DateTools.Resolution resolution) 方法 ,先把时间转换为字符串进行索引。

查询语法: date:[6/1/2005 TO 6/4/2005]

还可以overwrites QueryParser类的getRangeQuery(String, String, String, boolean)方法实现自定义的范围搜索。

 

 

 

分享到:
评论
4 楼 jolestar 2009-06-04  
sunjun 写道

你好,问你一下,为什么我按你说的进行范围查询,查询出来结果不对
我有个图片搜索,搜索结果按大小(width, height)分类
索引的时候我存储了width, height, 比如 200 ,400
1,
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(new RangeQuery(new Term("width", "0"), new Term("width", "500"), true), Occur.SHOULD);
这样查询出来有width>500的结果
booleanQuery.add(new RangeQuery(new Term("width", "000"), new Term("width", "500"), true), Occur.SHOULD);
这样查询出来也有width>500的结果

2,
后来我将width,height索引时全部按4位数存储,如200则存储为0200
再查询
booleanQuery.add(new RangeQuery(new Term("width", "000"), new Term("width", "500"), true), Occur.SHOULD);
结果比上面稍微好了点,但是还是有很多不对的结果出现

3,后来我又换了个思路,在索引时就把他的分类存储起来,按width和height共分为4类, 大(1),较大(2),较小(3),小(4)
我直接存储了一个field为sizeType,
使用TermQuery query=new TermQuery(new Term("sizeType","1"));
这样也不行,sizeType为2,3,4都有出现,

请教一下,这个问题怎么解决,是不是我索引时的keyword在其它Field的里面也存在了啊,看了下输出的结果,感觉有点可能,
但是我上面的3个做法都只是从当前我关心的Field里面去搜索,与其它的Field应该无关啊

lucene有没有进行精确匹配的搜索方法,就像在数据库中查询字段=值



按道理不会出现这种问题的啊。指定字段查询就是精确查询。
3 楼 fffddgx 2009-06-02  
谢谢,有收获
2 楼 sunjun 2009-05-29  
你好,问你一下,为什么我按你说的进行范围查询,查询出来结果不对
我有个图片搜索,搜索结果按大小(width, height)分类
索引的时候我存储了width, height, 比如 200 ,400
1,
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(new RangeQuery(new Term("width", "0"), new Term("width", "500"), true), Occur.SHOULD);
这样查询出来有width>500的结果
booleanQuery.add(new RangeQuery(new Term("width", "000"), new Term("width", "500"), true), Occur.SHOULD);
这样查询出来也有width>500的结果

2,
后来我将width,height索引时全部按4位数存储,如200则存储为0200
再查询
booleanQuery.add(new RangeQuery(new Term("width", "000"), new Term("width", "500"), true), Occur.SHOULD);
结果比上面稍微好了点,但是还是有很多不对的结果出现

3,后来我又换了个思路,在索引时就把他的分类存储起来,按width和height共分为4类, 大(1),较大(2),较小(3),小(4)
我直接存储了一个field为sizeType,
使用TermQuery query=new TermQuery(new Term("sizeType","1"));
这样也不行,sizeType为2,3,4都有出现,

请教一下,这个问题怎么解决,是不是我索引时的keyword在其它Field的里面也存在了啊,看了下输出的结果,感觉有点可能,
但是我上面的3个做法都只是从当前我关心的Field里面去搜索,与其它的Field应该无关啊

lucene有没有进行精确匹配的搜索方法,就像在数据库中查询字段=值
1 楼 yaozhan189 2008-12-18  
数字的范围查询
这个方法对我有用,谢谢分享

相关推荐

    Lucene时间区间搜索

    在上面的代码中,`DateTools.DateToString`方法将DateTime对象转换为Lucene可理解的字符串格式,然后创建了一个包含这两个时间点的闭合范围查询。这里的“true”参数表示边界是包含的。 接下来,我们需要将这个...

    Lucene3.0之查询类型详解

    - **RangeQuery**:用于指定一个范围内的查询,如年龄、日期等,可以设置是否包含边界。可以使用TermRangeQuery类创建或通过QueryParser解析包含边界符号的字符串。 - **BooleanQuery**:用于组合多个查询条件,...

    lucene的查询语法事例

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

    lucene facet查询示例

    **Lucene Facet查询详解** Lucene是一款强大的全文搜索引擎库,广泛应用于各种信息检索系统。在处理大量数据时,为了帮助用户快速、有效地探索和理解数据,Lucene引入了Facets(方面)功能,它提供了分类浏览和统计...

    lucene表达式处理查询

    让我们通过几个示例来理解Lucene表达式的用法: - **基本查询**: `title:Java` - 在标题字段中查找包含"Java"的文档。 - **多字段查询**: `(title:Java OR description:Java)` - 在标题或描述字段中查找包含...

    lucene相关十几个包

    这个压缩包包含了十几个与Lucene相关的JAR文件,这些文件分别对应于不同的Lucene组件和版本,用于实现不同的功能。让我们逐一解析这些文件及其在Lucene中的作用。 1. **lukeall-4.7.1.jar**:Luke是Lucene的可视化...

    供lucene初学者学习的几个类

    下面我们将深入探讨与标题和描述相关的几个关键Lucene类,以及如何进行建索引和查询操作。 1. **Analyzer**: 分析器是Lucene的核心组件之一,负责将输入文本拆分成一系列可搜索的术语(tokens)。例如,`...

    Lucene索引和查询

    查询阶段,用户输入查询字符串,Lucene将这个字符串转换为查询对象,然后与索引进行匹配。查询操作通常包括以下步骤: - 查询分析(Query Parsing):将用户的输入转换为查询语法,可能涉及短语查询、布尔查询等。 ...

    lucene实现过程中存在的问题

    Lucene作为一款强大的搜索引擎库,在实际应用中确实会遇到一些问题,如平台异常、查询异常、显示问题以及写锁异常等。针对这些问题,我们可以通过一系列措施来进行预防和解决,如正确使用查询语法、优化显示逻辑、...

    Lucene5学习之分页查询

    Lucene的搜索过程主要包括分析、索引构建和查询执行三个阶段。在查询执行阶段,我们通过`IndexSearcher`对预构建的索引进行查询,获取匹配的文档。`search()`方法返回的是`TopDocs`对象,它包含了匹配文档的分数和...

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

    在本文中,我们将深入探讨如何使用Lucene查询工具类和`IndexSearcher`进行分页查询,这在处理大量数据时尤其有用。Lucene是一个强大的全文搜索引擎库,它提供了高效、可扩展的文本检索功能。在Java开发环境中,...

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

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

    lucene分组查询优化facet

    在搜索引擎和大数据分析领域,Apache Lucene 是一个广泛使用的全文检索库,它提供了高效、可扩展的搜索功能。其中,Facet(分面)查询是Lucene提供的一种强大的分类和统计功能,它允许用户根据特定的维度(如作者、...

    Lucene分词与查询详解

    在深入理解Lucene的分词与查询机制之前,我们需要了解以下几个核心概念: 1. **分词(Tokenization)**:在Lucene中,分词是将输入的文档内容分解成一系列独立的、有意义的单元——称为“词元”(Tokens)。这个...

    lucene 4.7.2 Demo

    范围搜索是Lucene的另一个亮点,允许用户按数值或日期范围进行过滤。例如,你可以搜索价格在特定区间内的商品,或者查找某个时间段内的新闻。这需要利用RangeQuery或NumericRangeQuery类来构建相应的查询条件。 ...

    Lucene查询语法

    ### Lucene查询语法详解 #### 一、Lucene概述 Lucene是一款高性能、全功能的文本搜索引擎库,被广泛应用于各种需要实现全文检索的应用场景之中。Lucene支持复杂的查询语法,能够灵活地处理多样化的查询需求,使得...

    lucene做索引查询流程

    lucene 做索引查询流程,来自《lucene in action》

    Lucene 索引的简单使用

    Lucene,作为Apache软件基金会的一个开源项目,是Java平台上的全文检索库,它提供了文本检索的核心工具,使得开发者能够快速地在应用程序中实现高级的搜索功能。本篇文章将详细阐述如何使用Lucene来创建和查询索引,...

    lucene相关jar+查询分析器jar

    在"lucene相关jar+查询分析器jar"这个主题中,我们可以深入讨论以下几个关键知识点: 1. **Lucene的组件和工作流程**:Lucene主要包括索引和查询两个主要阶段。在索引阶段,它将文本数据转换成倒排索引,这是一个...

    Lucene示例 BM25相似度计算

    总之,Lucene的BM25示例是一个极好的学习资源,它涵盖了从索引构建到查询执行的关键步骤,并通过实际对比展示了如何使用更先进的相似度算法提升搜索效果。对于希望在文本检索领域深入研究或应用Lucene的开发者来说,...

Global site tag (gtag.js) - Google Analytics