【问题标题】:searching lucene index on multiple fields在多个字段上搜索 lucene 索引
【发布时间】:2012-02-12 04:04:53
【问题描述】:

我有一个包含 2 个内容字段的索引(分析、索引和存储):
例如:namehobbies。 (爱好字段可以多次添加不同的值)。

我有另一个字段仅被索引(未分析且未存储)用于过滤:
例如:country_code

现在,我想构建一个查询,该查询将检索与某些“搜索”输入字段匹配(尽可能)匹配的文档,但只有country_code 具有某些确切值的此类文档。

用于构建此类查询的最合适的组合查询语法/查询解析器是什么。

【问题讨论】:

    标签: lucene query-parser


    【解决方案1】:

    您可以使用以下查询:

    country_code:india +(name:search_value OR hobbies:search_value)
    

    【讨论】:

    • 谢谢,这正是我所需要的。我还在开头添加了另一个 +。
    【解决方案2】:

    为什么不从QueryParser 开始,它可能适用于您的用例,而且需要的工作量最少。

    您的问题尚不清楚,但我们假设您有一个输入字段(“搜索”)和一个国家代码组合框。然后,您将读取这些值并创建一个查询:

    // you don't have to use two parsers, you can do this using one.
    QueryParser nameParser = new QueryParser(Version.LUCENE_CURRENT, "name", your_analyzer);
    QueryParser hobbiesParser = new QueryParser(Version.LUCENE_CURRENT, "hobbies", your_analyzer);
    
    BooleanQuery q = new BooleanQuery();
    q.add(nameParser.parser(query), BooleanClause.Occur.SHOULD);
    q.add(hobbiesParser.parser(query), BooleanClause.Occur.SHOULD);BooleanClause.Occur.SHOULD);
    
    /* Filtering by country code can be done using a BooleanQuery 
     * or a filter, the difference will be how Lucene scores matches. 
     * For example, using a filter:
     */
    Filter countryCodeFilter = new QueryWrapperFilter(new TermQuery(new Term("country_code", )));
    
    //and finally searching:
    TopDocs topDocs = searcher.search(q, countryCodeFilter, 10);
    

    【讨论】:

    • 您能否就您所说的两种过滤替代方案添加更多信息?它将如何影响评分?那么性能呢?
    • 这听起来像是另一个stackoverflow问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多