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