Lucene自定义规则范围查询

0x00

  level: 0x04

0x01

  code:

package org.apache.lucene.demo.big.query;

import java.io.IOException;
import java.util.Comparator;

import org.apache.lucene.index.FilteredTermsEnum;
import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.search.MultiTermQuery;
import org.apache.lucene.util.AttributeSource;
import org.apache.lucene.util.BytesRef;

public class IpRangeQuery extends MultiTermQuery {

    private String    minIp, maxIp;

    public IpRangeQuery(String field, String minIp, String maxIp) {
        super(field);
        this.minIp = minIp;
        this.maxIp = maxIp;
    }

    @Override
    protected TermsEnum getTermsEnum(Terms terms, AttributeSource atts) throws IOException {
        return new IpRangeTermsEnum(terms.iterator(null));
    }

    private final class IpRangeTermsEnum extends FilteredTermsEnum {
        private Comparator<String>    termComp    = new Comparator<String>() {
                                                                                        @Override
                                                                                        public int compare(String ip1, String ip2) {
                                                                                            if (ip1.equals(ip2))
                                                                                                return 0;
                                                                                            return getIpLong(ip1) - getIpLong(ip2) > 0 ? 1 : -1;
                                                                                        }
                                                                                    };

        private long getIpLong(String ip) {
            long v = 0;
            int startIndex = 0;
            int postion = 0;
            int vBase = 1;
            String ipByte = "";

            for (int i = 0; i < 4; i++) {

                if (i == 3) {
                    ipByte = ip.substring(startIndex, ip.length());
                } else {
                    postion = ip.indexOf(".", startIndex);
                    ipByte = ip.substring(startIndex, postion);
                    startIndex = postion + 1;
                }

                switch (i) {
                case 0:
                    vBase = 1 * 1000 * 1000 * 1000;
                    break;
                case 1:
                    vBase = 1 * 1000 * 1000;
                    break;
                case 2:
                    vBase = 1 * 1000;
                    break;
                default:
                    vBase = 1;
                    break;
                }

                v += Long.valueOf(ipByte) * vBase;
            }

            return v;
        }

        public IpRangeTermsEnum(TermsEnum tenum) {
            super(tenum);
        }

        @Override
        protected final BytesRef nextSeekTerm(BytesRef term) {
            String termStr = term == null ? null : term.utf8ToString();

            if (termStr != null && termComp.compare(termStr, maxIp) > 0)
                return null;

            if (termStr != null && termComp.compare(minIp, termStr) > 0)
                return null;

            return term == null ? new BytesRef(minIp) : term;
        }

        @Override
        protected final AcceptStatus accept(BytesRef term) {
            String termStr = term.utf8ToString();

            if (termComp.compare(termStr, minIp) < 0)
                return AcceptStatus.NO;

            if (termComp.compare(maxIp, termStr) < 0)
                return AcceptStatus.NO;

            return AcceptStatus.YES;

        }
    }

    @Override
    public String toString(String field) {
        return this.field + ":[" + this.minIp + " TO " + this.maxIp + "]";
    }

}

0x02

  参考: TermRangeQuery 和 NumericRangeQuery

时间: 2024-11-13 04:42:43

Lucene自定义规则范围查询的相关文章

Lucene自定义扩展QueryParser

Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁之间的document中搜索并排序.其实lucene自带的NumericRangeQuery类已经能实现这个功能了,如下: public void testInclusive() throws Exception { Directory dir = FSDirectory(---); IndexSe

一步一步跟我学习lucene(14)---lucene搜索之facet查询原理和facet查询实例

Facet说明 我们在浏览网站的时候,经常会遇到按某一类条件查询的情况,这种情况尤以电商网站最多,以天猫商城为例,我们选择某一个品牌,系统会将该品牌对应的商品展示出来,效果图如下: 如上图,我们关注的是品牌,选购热点等方面,对于类似的功能我们用lucene的term查询当然可以,但是在数据量特别大的情况下还用普通查询来实现显然会因为FSDirectory.open等耗时的操作造成查询效率的低下,同时普通查询是全部document都扫描一遍,这样显然造成了查询效率低: lucene提供了facet

StyleCop学习笔记——自定义规则

本文将简单的一步一步的指导这可能有助于学习如何创建自己的规则 1.创建一个项目. Visual Studio创建一个新的类库项目.NET3.5 2.引用两个DLL,StyleCop.dll和StyleCop.Csharp.dll. 3.添加自定义的规则. MyCustomAnalyzer.cs代码如下: using StyleCop; using StyleCop.CSharp; namespace MyCustomRules { /// <summary> /// Custom analyz

Learn Prolog Now 翻译 - 第一章 - 事实,规则和查询 - 第二节, Prolog语法介绍

内容摘要: 原子(Atom) 数字(Numbers) 变量(Variables) 复杂语句(Complex Terms) 通过上一节的学习,我们已经大概熟悉了Prolog的编程思路,这一节我们会回过头,详细学习其中的一些语法细节.首先,问一个基础的问题:我们已经在Prolog程序中看到了很多类型的表达式 (比如,jody,playsAirGuitar(mia),和X),但这些仅仅只是例子,是时候更加深入了,到底事实.规则和查询是由什么构成的? 答案就是语句(terms),在Prolog中一共存在

Lucene 自定义分析器

自定义一个NGramAnalyzer: 1 package org.apache.lucene.analysis.ngram; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileReader; 6 import java.io.IOException; 7 import java.io.Reader; 8 import java.util.ArrayList; 9 import java.

1. PMD 使用,编译和自定义规则

一 PMD简介 PMD是一款代码静态检查工具,可以检查出很多代码中潜在的bug以及让人感到疑惑的代码,具体大家可以百度下. 二 PMD源代码下载 下载地址: https://github.com/pmd/pmd/tree/pmd/5.5.x 需要注意的是注意选择branch,一般选择最新的branch:然后可以用git clone下来,或者直接下载zip压缩包. 如下: 从上图也可以看到,pmd支持的语言有很多,java的检测那就是在pmd-java里面. 三 maven下载和环境变量配置 参考

【猪猪-后端】WebMagic框架搭建的爬虫,根据自定义规则,直接抓取,使用灵活,Demo部署即可查看。

原文:[猪猪-后端]WebMagic框架搭建的爬虫,根据自定义规则,直接抓取,使用灵活,Demo部署即可查看. 源代码下载地址:http://www.zuidaima.com/share/1581523414404096.htm 如果要使用注解方式实现,也是支持的. @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") public class OschinaBlog { @ExtractBy("//title&qu

如何使用PMD自定义规则

准备工作 首先在PMD官网下载最新版本的文件,目前最新版本是5.4.1. 下载pmd-bin-5.4.1.zip和pmd-src-5.4.1.zip之后解压备用. pmd-src-5.4.1是PMD源码包,是无法直接执行的. pmd-bin-5.4.1是PMD的可执行包 目录简介 pmd-src-5.4.1中除了pmd-core是PMD的核心执行调度模块,其他文件夹都是各种语言检查规则的模块. 其中pmd-bin-5.4.1\lib目录中是执行所依赖的jar包. pmd-bin-5.4.1\bi

Learn Prolog Now 翻译 - 第一章 - 事实,规则和查询 - 第一节, 一些简单的例子

 该系列文章是网上的Prolog学习资料:www.learnprolognow.org的中文翻译.希望能够通过翻译此学习资料,达到两个目的:第一.系统学习prolog的知识:第二.提升英文文章理解 和翻译能力. 内容摘要: 给出一些Prolog编程的简单例子: Prolog的基本结构:事实,规则和查询: 环境说明: 本系列文章使用的Prolog运行环境是:SWI-Prolog,官网地址是:http://www.swi-prolog.org. Prolog中只有三种基础结构:事实(facts),规