【问题标题】:How to specify two Fields in Lucene QueryParser?如何在 Lucene QueryParser 中指定两个字段?
【发布时间】:2011-01-01 13:58:56
【问题描述】:

我读了How to incorporate multiple fields in QueryParser?,但没听懂。

目前我有一个非常奇怪的结构,例如:

parser = New QueryParser("bodytext", analyzer)
parser2 = New QueryParser("title", analyzer)
query = parser.Parse(strSuchbegriff)
query2 = parser.Parse(strSuchbegriff)

我能做些什么:

parser = New QuerParser ("bodytext" , "title",analyzer)
query =parser.Parse(strSuchbegriff) 

因此解析器会在“bodytext”字段和“title”字段中查找搜索词。

【问题讨论】:

    标签: java parsing lucene lucene.net information-retrieval


    【解决方案1】:

    有 3 种方法可以做到这一点。

    第一种方法是手动构造查询,这是QueryParser 在内部做的。这是最强大的方法,意味着如果您想阻止访问QueryParser 的一些更奇特的功能,您不必解析用户输入:

    IndexReader reader = IndexReader.Open("<lucene dir>");
    Searcher searcher = new IndexSearcher(reader);
    
    BooleanQuery booleanQuery = new BooleanQuery();
    Query query1 = new TermQuery(new Term("bodytext", "<text>"));
    Query query2 = new TermQuery(new Term("title", "<text>"));
    booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
    booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
    // Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
    // for AND queries
    Hits hits = searcher.Search(booleanQuery);
    

    第二种方法是使用MultiFieldQueryParser,它的行为类似于QueryParser,允许访问它拥有的所有权力,除了它会搜索多个字段。

    IndexReader reader = IndexReader.Open("<lucene dir>");
    Searcher searcher = new IndexSearcher(reader);
    
    Analyzer analyzer = new StandardAnalyzer();
    MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
                                            new string[] {"bodytext", "title"},
                                            analyzer);
    
    Hits hits = searcher.Search(queryParser.parse("<text>"));
    

    最后一种方法是使用QueryParsersee here的特殊语法。

    IndexReader reader = IndexReader.Open("<lucene dir>");
    Searcher searcher = new IndexSearcher(reader);    
    
    Analyzer analyzer = new StandardAnalyzer();
    QueryParser queryParser = new QueryParser("<default field>", analyzer);
    // <default field> is the field that QueryParser will search if you don't 
    // prefix it with a field.
    string special = "bodytext:" + text + " OR title:" + text;
    
    Hits hits = searcher.Search(queryParser.parse(special));
    

    您的另一种选择是在索引内容时创建一个名为 bodytextandtitle 的新字段,您可以将 bodytext 和标题的内容放入其中,然后您只需搜索一个字段。

    【讨论】:

    • 感谢您提供的“string special = "bodytext:" + text + " OR title:" + text",它解决了我的问题:D
    • 我们必须使用builder BooleanQuery.Builder finalQuery = new BooleanQuery.Builder();
    【解决方案2】:

    我们不能使用 BooleanQuery booleanQuery = new BooleanQuery();

    我们必须使用构建器 BooleanQuery.Builder finalQuery = new BooleanQuery.Builder(); 然后我们可以使用 finalQuery.build();获取查询

    更通用的方法是

    私有静态 TopDocs 搜索(地图过滤器,IndexSearcher 搜索器)抛出异常 { StandardAnalyzer 分析器 = new StandardAnalyzer(); BooleanQuery.Builder finalQuery = new BooleanQuery.Builder(); for(字符串属性:filters.keySet()){ QueryParser queryParser = new QueryParser(属性,分析器); 查询查询 = queryParser.parse(filters.get(attribute)); finalQuery.add(query, Occur.MUST); } TopDocs hits = searcher.search(finalQuery.build(),10); 回击; }

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2015-12-15
      • 2010-10-02
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2011-06-28
      相关资源
      最近更新 更多