Pau*_*lor 5 java lucene search
在我的3.6代码中,我将数字字段添加到我的索引中,如下所示:
public void addNumericField(IndexField field, Integer value) {
        addField(field, NumericUtils.intToPrefixCoded(value));
    }
但是现在你需要传递一个BytesRef参数,并且完全不清楚你对下一个值的意图是什么,所以我改为(正在进行中)
public void addNumericField(IndexField field, Integer value) {
        FieldType ft = new FieldType();
        ft.setStored(true);
        ft.setIndexed(true);
        ft.setNumericType(FieldType.NumericType.INT);
        doc.add(new IntField(field.getName(), value, ft));
    }
看起来更整洁
在3.6中我还添加了覆盖queryparser以使其适用于数值范围搜索,
package org.musicbrainz.search.servlet;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.util.NumericUtils;
import org.musicbrainz.search.LuceneVersion;
import org.musicbrainz.search.index.LabelIndexField;
import org.musicbrainz.search.servlet.mmd1.LabelType;
public class LabelQueryParser extends MultiFieldQueryParser {
    public LabelQueryParser(java.lang.String[] strings, org.apache.lucene.analysis.Analyzer analyzer)
    {
        super(LuceneVersion.LUCENE_VERSION, strings, analyzer);
    }
     protected Query newTermQuery(Term term) {
        if(
                (term.field() == LabelIndexField.CODE.getName())
                ){
            try {
                int number = Integer.parseInt(term.text());
                TermQuery tq = new TermQuery(new Term(term.field(), NumericUtils.intToPrefixCoded(number)));
                return tq;
            }
            catch (NumberFormatException nfe) {
                //If not provided numeric argument just leave as is, 
                //won't give matches
                return super.newTermQuery(term);
            }
        } else {
            return super.newTermQuery(term);
        }
    }
    /**
     *
     * Convert Numeric Fields
     *
     * @param field
     * @param part1
     * @param part2
     * @param inclusive
     * @return
     */
    @Override
    public Query newRangeQuery(String field,
                               String part1,
                               String part2,
                               boolean inclusive) {
        if (
                (field.equals(LabelIndexField.CODE.getName()))
            )
        {
            part1 = NumericUtils.intToPrefixCoded(Integer.parseInt(part1));
            part2 = NumericUtils.intToPrefixCoded(Integer.parseInt(part2));
        }
        TermRangeQuery query = (TermRangeQuery)
                super.newRangeQuery(field, part1, part2,inclusive);
        return query;
    }
}
所以我把这一切都搞清楚了,我不再需要了它,但不幸的是,这个IntField现在没有任何疑问.
进一步阅读它似乎Intfields仅用于范围查询,所以我不知道你是如何做匹配查询,以及NumericRangeQuery是否可以与我正在使用的经典Query Parser兼容.
所以我接着尝试将我的数值添加为编码字符串
public void addNumericField(IndexField field, Integer value) {
    FieldType fieldType = new FieldType();
    fieldType.setStored(true);
    fieldType.setIndexed(true);
    BytesRef bytes = new BytesRef(NumericUtils.BUF_SIZE_INT);
    NumericUtils.intToPrefixCoded(value, 0, bytes);
    doc.add(new Field(field.getName(),bytes, fieldType));
}
但在运行时我现在收到错误!
java.lang.IllegalArgumentException: Fields with BytesRef values cannot be indexed
但我需要索引字段,所以请问我如何索引数字字段,就像我在3.6中所做的那样,所以我可以搜索它们.
只需使用适当的字段即可。例如IntField, LongField, 等.
例如,请参阅http://lucene.apache.org/core/4_1_0/core/org/apache/lucene/document/IntField.html
要查询这些字段,请参阅Lucene LongField 精确搜索与查询