Lucene搜索查询动态更新并添加其他查询字段?

时间:2014-05-04 09:13:01

标签: java lucene

我正在进行分面搜索,其中一个要求是从构面下拉列表中选择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库 我有一个疑问,这种查询更新是否有可能。
如果这是有效的情况并且可以实现,任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

不要使用TermQueryTermQuery是一个与给定文本完全匹配的简单查询。如果您手动构建查询,则不会有查询解析器为您处理这类事情,因此您必须自己选择正确类型的查询。

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*)