首页 > 解决方案 > Lucene 6.2.1 如何在不知道其名称的情况下获取所有字段名称或搜索所有字段

问题描述

我是 Lucene 的新手,我想知道是否有一种方法可以在不知道它们的名称的情况下搜索多个文档中的所有可能字段,或者......另一种方法:获取所有字段名称(版本 6.2.1)

  1. 例如:如何从“字段”数组中获取所有名称而不是像下面的示例那样填充它们

    Analyzer analyzer = new StandardAnalyzer();
    String querystr = "test";
    String[] fields = {"title","isbn","desc", "name", "surname", "description"};
    BooleanClause.Occur[] flags = new BooleanClause.Occur[fields.length];
    Arrays.fill(flags, BooleanClause.Occur.SHOULD);
    Query query = MultiFieldQueryParser.parse(querystr, fields, flags, analyzer);
    

    我已经检查了这些主题:

    a)如何搜索所有字段?

    我们已经实现了这个答案:

    1) 索引时间方法:使用包罗万象的字段。这只不过是附加所有字段中的所有文本(输入文档中的总文本)并将产生的巨大文本放在单个字段中。您必须在索引时添加一个额外的字段以充当一个包罗万象的字段。

    但如果有可能,我们想改变它

    b) https://www.programcreek.com/java-api-examples/index.php?api=org.apache.lucene.queryParser.MultiFieldQueryParser

    c) IndexReader.getFieldNames Lucene 4

    但这些解决方案在 Lucene 版本 6.2.1 中不存在

    IndexReader.getFieldNames() (v. 3.3.0)

    最终 AtomicReader 阅读器 = searcher.getAtomicReader();

    final FieldInfos infos = reader.getFieldInfos(); (第 4.2.1 节)

  2. ...或者是否有一种方法(不一定是 MultiFieldQueryParser)可以搜索所有没有名称的字段(v. 6.2.1)?

标签: javalucene

解决方案


如果您已经实施了将要搜索的所有文本放入一个包罗万象的字段的解决方案,为什么要更改它。如果你想改变它,因为它看起来像一个黑客,让我向你保证,这是解决这个问题的正确、最佳的解决方案。这是SolrElasticSearch的文档中推荐的模式。

生成一个字段列表并针对所有这些字段创建一个大而复杂的查询是 hack。您绝对应该坚持使用您已经实施的解决方案。


如果您是一个可怜的、不幸的人,无法重新索引以添加包含您需要搜索的所有内容的新字段,并且您确实需要一种方法来获取所有字段的列表并针对它们进行查询,这里你走。您可以简单地获取 LeafReader 中的字段列表,并且 DirectoryReader(来自 DirectoryReader.open,例如)包含 LeafReaderContexts 列表。因此,遍历 LeafReaders,并获取并合并每个字段的列表,以获取索引中字段的完整列表:

DirectoryReader reader = DirectoryReader.open(Paths.get('/path/to/my/index'));
HashSet<String> fieldnames = new HashSet<String>();
for (LeafReaderContext subReader : reader.leaves) {
    Fields fields = subReader.reader().fields();
    for (String fieldname : fields) {
        fieldnames.add(fieldname);
    }
}

您可以在应用程序启动时或重新打开阅读器时执行此操作,而不是每次查询时执行此操作。现在您有了可以传递给MultiFieldQueryParser的字段名称列表,或者将一堆 TermQueries 放入 BooleanQuery 或 DisjunctionMaxQuery 等。


推荐阅读