gpt4 book ai didi

java - 你如何在 Lucene 4.1 中索引和搜索数字

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:31 25 4
gpt4 key购买 nike

在我的 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 是否与我正在使用的经典查询解析器兼容。

然后我又回去尝试将我的数值添加为编码字符串

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 中那样索引数字字段以便搜索它们。

最佳答案

请注意,如何使用 lucene 4.7 来完成此操作:

当索引时我只是做如下:

document.add(new IntField("int_field", int_value, Field.Store.YES));

对于搜索:

public class MyQueryParser extends QueryParser {

public MyQueryParser(Version matchVersion, String field, Analyzer anlayzer) {
super(matchVersion, field, anlayzer);
}

@Override
protected Query getRangeQuery(String field, String part1, String part2, boolean startInclusive, boolean endInclusive) throws ParseException {
if ("int_field".equals(field)) {
return NumericRangeQuery.newIntRange(field, Integer.parseInt(part1), Integer.parseInt(part2), startInclusive, endInclusive);
} else {
return super.getRangeQuery(field, part1, part2, startInclusive, endInclusive);
}
}

@Override
protected Query newTermQuery(Term term)
{
if ("int_field".equals(term.field())) {
try {
int number = Integer.parseInt(term.text());
BytesRef bytes = new BytesRef(NumericUtils.BUF_SIZE_INT);
NumericUtils.intToPrefixCoded(number, 0, bytes);
TermQuery tq = new TermQuery(new Term(term.field(), bytes.utf8ToString()));
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);
}
}

通过这样做,像这样的查询

 int_field: 1
int_field: [1 TO 5]

按预期工作。

关于java - 你如何在 Lucene 4.1 中索引和搜索数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15068257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com