【问题标题】:Is there a way to use MultiFieldQuery combined with NumericRanges in Lucene?有没有办法在 Lucene 中将 MultiFieldQuery 与 NumericRanges 结合使用?
【发布时间】:2015-01-18 17:06:33
【问题描述】:

我目前正在使用 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));

有没有办法使用MultiFieldQueryParser 执行NumericRangeQuery

【问题讨论】:

  • 您找到解决方案了吗?

标签: java lucene information-retrieval


【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2021-11-03
    • 2011-08-24
    • 2015-04-05
    • 2020-03-26
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多