zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/feng2015/p/4313812.html
Copyright © 2011-2022 走看看