我正在进行分面搜索,其中一个要求是从构面下拉列表中选择id值。 id 值将在1位到16位范围内,但在数据中,这些 id 值将为从8位到16位。
我必须支持来自UI和REST api的以下用例。
示例查询:
http://localhost:7001/app/api/search/meta.type:typeA AND id:value?results=facet:id
要求是根据为 id 属性传递的值更正查询。 如果传递的值的长度小于8位。即如果小于99999999,我必须进行正则表达式搜索,否则正常匹配搜索 例如:
1)
实际:+ meta.type:typeA + id
modified + meta.type:typeA + id:8 + id:8 *
2)
实际+ meta.type:typeA + id:4567
modified + meta.type:typeA + id:4567 + id:4567 *
3)
实际+ meta.type:typeA + id:12345678
modified + meta.type:typeA + id:12345678 + id:12345678 *
4)
实际+ meta.type:typeA + id:123456789
modified + meta.type:typeA + id:123456789
查询类型是BooleanQuery。
我试过以下,但它对查询值没有影响。 (在查询中添加另一个值,因为第一个值不会返回任何内容)
Query [] termArray = new Query [1];
BooleanQuery bq = new BooleanQuery();
bq.add(new TermQuery(new Term("id", queryKeyValue + "*")), BooleanClause.Occur.MUST);
termArray[0] = Query.mergeBooleanQueries(bq);;
query.combine(termArray);
我正在使用Lucene 3.6库
我有一个疑问,这种查询更新是否有可能。
如果这是有效的情况并且可以实现,任何人都可以帮助我吗?
答案 0 :(得分:0)
不要使用TermQuery
。 TermQuery
是一个与给定文本完全匹配的简单查询。如果您手动构建查询,则不会有查询解析器为您处理这类事情,因此您必须自己选择正确类型的查询。
PrefixQuery
是您正在寻找的那个:
bq.add(new PrefixQuery(new Term("id", queryKeyValue)), BooleanClause.Occur.MUST);
但是,我不认为这会做你想做的事。 之间的区别
+meta.type:typeA +id:12345678
和
+meta.type:typeA +id:12345678 +id:12345678*
实际上是非常微不足道的。您不会以这种方式获得更多结果,因为您仍然要求精确id
匹配。我相信你所寻找的可能更像是:
+meta.type:typeA +(id:12345678 id:12345678*)