【问题标题】:Lucene search query dynamic update and add additional query fields?Lucene 搜索查询动态更新并添加额外的查询字段?
【发布时间】:2014-05-04 23:50:28
【问题描述】:

我正在进行构面搜索,其中一项要求是从构面下拉列表中选择 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
修改 +meta.type:typeA +id:8 +id:8*
2)
实际 +meta.type:typeA +id:4567
修改 +meta.type:typeA +id:4567 +id:4567*
3)
实际 +meta.type:typeA +id:12345678
修改 +meta.type:typeA +id:12345678 +id:12345678*
4)
实际 +meta.type:typeA +id:123456789
修改 +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 库。
我有一个疑问,这种查询更新是否可行。
如果这是有效的场景并且可以实现,有人可以帮助我吗?

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    不要使用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*)
    

    【讨论】:

    • +meta.type:typeA +(id:12345678 id:12345678*) 我认为这应该是正确的。
    • +meta.type:typeA +(id:12345678 id:12345678*) 我已按照查询使用此格式。这解决了我的问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2012-04-29
    • 2021-02-03
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多