java – 如何在Lucene 4.1中编制索引和搜索数字
发布时间:2020-12-14 19:34:14 所属栏目:Java 来源:网络整理
导读:在我的3.6代码中,我将数字字段添加到我的索引中,如下所示: public void addNumericField(IndexField field,Integer value) { addField(field,NumericUtils.intToPrefixCoded(value)); } 但是现在你需要传递一个BytesRef参数,并且完全不清楚你对下一个值的意
在我的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,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 exact search with Query (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |