函数将复合字段扩展为lucene查询

时间:2012-05-10 12:22:09

标签: regex lucene field composite

我无法实现将复合字段应用于Lucene查询的函数。

而不是输入lucene查询:

标题:"正确的方式"主题:"正确的方式"

我希望用户能够输入:

所有:"正确的方式"

所有都是由真实字段标题和主题组成的复合字段。该函数应该生成一个有效的lucene查询,其中扩展了复合字段的成分。

String query = applyCompositeFields(String query,String compositeField,String [] subFields){

} 提供的查询可以是根据lucene查询语法的任何查询(请参阅:http://lucene.apache.org/core/old_versioned_docs/versions/3_0_0/queryparsersyntax.html#Range%20Searches

例如:

全部:[20020101至20030101]

应扩展为:

标题:[20020101至20030101]主题:[20020101至20030101]

关于如何在不破坏复杂查询输入的情况下巧妙地做到这一点的任何想法?

我已尝试使用Lucene查询对象模型,但是,无法在查询元素上设置字段名称,因此无用。

1 个答案:

答案 0 :(得分:0)

我认为MultiFieldQueryParser正是您所寻找的。

修改

MultiFieldQueryParser将:

    如果字段在查询字符串中不明确(<{1}}),则
  • 在多个字段中调度查询
  • 对单个字段使用普通查询,否则("The Right Way")。

例如,

title:"The Right Way"

打印

    MultiFieldQueryParser qp = new MultiFieldQueryParser(
            Version.LUCENE_36, new String[] { "subject", "body" },
            new KeywordAnalyzer());
    System.out.println(qp.parse("subject:\"hello\" body:test AND [1222 TO 2333]"));

如果您希望坚持使用虚拟复合字段 subject:hello +body:test +(subject:[1222 TO 2333] body:[1222 TO 2333]) 的语法,则可以在字段名称为all时扩展QueryParser以添加特殊情况。您可以通过查看MultiFieldQueryParser的源代码获得灵感。