<small id='zL8ne'></small><noframes id='zL8ne'>

      <bdo id='zL8ne'></bdo><ul id='zL8ne'></ul>
    1. <legend id='zL8ne'><style id='zL8ne'><dir id='zL8ne'><q id='zL8ne'></q></dir></style></legend>
      <i id='zL8ne'><tr id='zL8ne'><dt id='zL8ne'><q id='zL8ne'><span id='zL8ne'><b id='zL8ne'><form id='zL8ne'><ins id='zL8ne'></ins><ul id='zL8ne'></ul><sub id='zL8ne'></sub></form><legend id='zL8ne'></legend><bdo id='zL8ne'><pre id='zL8ne'><center id='zL8ne'></center></pre></bdo></b><th id='zL8ne'></th></span></q></dt></tr></i><div id='zL8ne'><tfoot id='zL8ne'></tfoot><dl id='zL8ne'><fieldset id='zL8ne'></fieldset></dl></div>

      <tfoot id='zL8ne'></tfoot>
    2. 如何让 Lucene 中的 QueryParser 处理数字范围?

      时间:2023-09-30
        • <i id='1UXKz'><tr id='1UXKz'><dt id='1UXKz'><q id='1UXKz'><span id='1UXKz'><b id='1UXKz'><form id='1UXKz'><ins id='1UXKz'></ins><ul id='1UXKz'></ul><sub id='1UXKz'></sub></form><legend id='1UXKz'></legend><bdo id='1UXKz'><pre id='1UXKz'><center id='1UXKz'></center></pre></bdo></b><th id='1UXKz'></th></span></q></dt></tr></i><div id='1UXKz'><tfoot id='1UXKz'></tfoot><dl id='1UXKz'><fieldset id='1UXKz'></fieldset></dl></div>
          <legend id='1UXKz'><style id='1UXKz'><dir id='1UXKz'><q id='1UXKz'></q></dir></style></legend>
          <tfoot id='1UXKz'></tfoot>

            <bdo id='1UXKz'></bdo><ul id='1UXKz'></ul>

                <tbody id='1UXKz'></tbody>
            • <small id='1UXKz'></small><noframes id='1UXKz'>

                本文介绍了如何让 Lucene 中的 QueryParser 处理数字范围?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

                new QueryParser(.... ).parse (somequery);
                

                它仅适用于字符串索引字段.假设我有一个名为 count 的字段,其中 count 是一个整数字段(在索引我认为数据类型的字段时)

                it works only for string indexed fields. Say i have a field called count where count is a integer field (while indexing the field I considered the data type)

                new QueryParser(....).parse("count:[1 TO 10]");
                

                上面的一个是行不通的.相反,如果我使用 "NumericRangeQuery.newIntRange" 这是有效的.但是,我只需要上面那个...

                The above one is not works. Instead If i used "NumericRangeQuery.newIntRange" which is working. But, i need the above one only...

                推荐答案

                遇到同样的问题并解决了,在这里分享一下我的解决方案:

                Had the same issue and solved it, so here I share my solution:

                要创建一个自定义查询解析器,该解析器将解析以下查询INTFIELD_NAME:1203"或INTFIELD_NAME:[1 TO 10]"并将字段 INFIELD_NAME 作为 Intfield 处理,我用以下内容覆盖了 newTermQuery:

                To create a custom query parser that will parse the following query "INTFIELD_NAME:1203" or "INTFIELD_NAME:[1 TO 10]" and handle the field INTFIELD_NAME as an Intfield, I overrided newTermQuery with the following:

                public class CustomQueryParser extends QueryParser {
                
                public CustomQueryParser(String f, Analyzer a) {
                    super(f, a);
                }
                
                protected Query newRangeQuery(String field, String part1, String part2, boolean startInclusive,
                    boolean endInclusive) {
                
                    if (INTFIELD_NAME.equals(field)) {
                    return NumericRangeQuery.newIntRange(field, Integer.parseInt(part1), Integer.parseInt(part2),
                        startInclusive, endInclusive);
                    }
                    return (TermRangeQuery) super.newRangeQuery(field, part1, part2, startInclusive, endInclusive);
                }
                
                
                protected Query newTermQuery(Term term) {
                    if (INTFIELD_NAME.equals(term.field())) {
                
                    BytesRefBuilder byteRefBuilder = new BytesRefBuilder();
                    NumericUtils.intToPrefixCoded(Integer.parseInt(term.text()), 0, byteRefBuilder);
                    TermQuery tq = new TermQuery(new Term(term.field(), byteRefBuilder.get()));
                
                    return tq;
                    } 
                    return super.newTermQuery(term);
                
                }
                }
                

                我从 http://www.mail-archive.com/search?l=java-user@lucene.apache.org&q=subject:%22Re%3A+How+do+you+properly+use+NumericField%22&o=newest&f=1 并做了3处修改:

                I took the code quoted in that thread from http://www.mail-archive.com/search?l=java-user@lucene.apache.org&q=subject:%22Re%3A+How+do+you+properly+use+NumericField%22&o=newest&f=1 and made 3 modifications :

                • 把 newRangeQuery 改写得更好一点

                • rewrote newRangeQuery a little more nicely

                替换为 newTermQuery 方法NumericUtils.intToPrefixCoded(Integer.parseInt(term.text()),NumericUtils.PRECISION_STEP_DEFAULT)));

                replaced in newTermQuery method NumericUtils.intToPrefixCoded(Integer.parseInt(term.text()),NumericUtils.PRECISION_STEP_DEFAULT)));

                by NumericUtils.intToPrefixCoded(Integer.parseInt(term.text()), 0, byteRefBuilder);

                当我第一次在同一数值字段的过滤器中使用此方法时,我将 0 作为我发现它作为 lucene 类中的默认值并且它正常工作.

                when I used this method for the first time in a filter on the same numeric field, I put 0 as I found it as a default value in a lucene class and it just worked.

                • 替换为 newTermQuery

                • replaced on newTermQuery

                TermQuery tq = new TermQuery(new Term(field,

                by TermQuery tq = new TermQuery(new Term(term.field(),

                使用字段"是错误的,因为如果您的查询有多个子句(FIELD:text OR INFIELD:100),它会占用第一个或前一个子句字段.

                using "field" is wrong, because if your query has several clauses (FIELD:text OR INTFIELD:100), it is taking the first or previous clause field.

                这篇关于如何让 Lucene 中的 QueryParser 处理数字范围?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:Java中数据规范化的拼写更正 下一篇:如何使用 Lucene 获取频繁出现的短语

                相关文章

                最新文章

                  <bdo id='SOfld'></bdo><ul id='SOfld'></ul>

                1. <small id='SOfld'></small><noframes id='SOfld'>

                  <legend id='SOfld'><style id='SOfld'><dir id='SOfld'><q id='SOfld'></q></dir></style></legend>
                  <i id='SOfld'><tr id='SOfld'><dt id='SOfld'><q id='SOfld'><span id='SOfld'><b id='SOfld'><form id='SOfld'><ins id='SOfld'></ins><ul id='SOfld'></ul><sub id='SOfld'></sub></form><legend id='SOfld'></legend><bdo id='SOfld'><pre id='SOfld'><center id='SOfld'></center></pre></bdo></b><th id='SOfld'></th></span></q></dt></tr></i><div id='SOfld'><tfoot id='SOfld'></tfoot><dl id='SOfld'><fieldset id='SOfld'></fieldset></dl></div>
                  <tfoot id='SOfld'></tfoot>