有没有办法在Lucene中使用MultiFieldQuery和NumericRanges?

时间:2014-11-20 17:56:43

标签: java lucene information-retrieval

我目前正在使用MultiFieldQueryParser创建和搜索。我有大约20个不同的字段,所有不同的数据类型,我希望搜索考虑所有这些。这是我正在构建解析器并获取查询对象的地方:

MultiFieldQueryParser mfqp = new MultiFieldQueryParser(
                keyHashSet.toArray(new String[] {}), analyzer);

mfqp.setAllowLeadingWildcard(true);

Query q = mfqp.parse(search);

System.out.println(q.getClass());

其中keyHashSet包含我的所有数据键。

每当我传入范围查询时,例如:

Heading:[0 to 360]

从打印输出返回的类是

class org.apache.lucene.search.TermRangeQuery

即使我像这样设置标题字段:

doc.add(new FloatField("Heading", value, Field.Store.YES));

有没有办法使用NumericRangeQuery执行MultiFieldQueryParser

1 个答案:

答案 0 :(得分:1)

我一直面临着同样的问题,那就是每当您使用MultiFieldQueryParser传递范围查询时,它将其解释为TermRangeQuery,因此我们需要根据需要自定义类MultiFieldQueryParser,我使用的是Lucene 4.7.2 ;这是我所做的,因为在索引期间我已经解析了很长时间,所以我只有一个要应用数字范围查询的字段,即“价格”,

public class CustomMultiFieldQueryParser extends MultiFieldQueryParser {

    public CustomMultiFieldQueryParser(Version matchVersion, String[] fields, Analyzer analyzer) {
        super(matchVersion, fields, analyzer);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected org.apache.lucene.search.Query getRangeQuery(String fieldName, String min, String max, boolean minInclusive,
            boolean maxInclusive) throws ParseException {
        // TODO Auto-generated method stub
        if(fieldName.equals("price")) {
            return NumericRangeQuery.newLongRange(fieldName, Long.parseLong(min), Long.parseLong(max), minInclusive, maxInclusive);
        }
        return super.getRangeQuery(fieldName, min, max, minInclusive, maxInclusive);
    }
}