Java Lucene 6.2.1如何获取所有字段名或在不知道其名称的情况下搜索所有字段

Java Lucene 6.2.1如何获取所有字段名或在不知道其名称的情况下搜索所有字段,java,lucene,Java,Lucene,我是Lucene的新手,我想知道是否有一种方法可以搜索多个文档中所有可能的字段,而不知道它们的名称或。。。另一种方法:获取所有字段名(版本6.2.1) 例如:如何从“字段”数组中获取所有名称,而不是像下面的示例中那样填充它们 Analyzer analyzer = new StandardAnalyzer(); String querystr = "test"; String[] fields = {"title","isbn","desc", "name", "surname", "descr

我是Lucene的新手,我想知道是否有一种方法可以搜索多个文档中所有可能的字段,而不知道它们的名称或。。。另一种方法:获取所有字段名(版本6.2.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)

    (c)

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

    IndexReader.getFieldNames()(3.3.0版)

    final AtomicReader=searcher.getAtomicReader()

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

  • …或者是否有一种方法(不一定是多字段QueryParser)可以搜索所有没有名称的字段(第6.2.1节)


  • 基于你的问题,我建议你只想搜索一些术语和字段,这些值实际上是在哪些字段中建立索引的,这不是很重要吗

    在这种情况下,最好的方法是基于elasticsearch或solr能够处理此问题的结构实现正常全文搜索:

    • 为每个文档添加专用的“全文”(TextField用于全文搜索)
    • 用其他字段的所有信息填充全文字段,并用空格分隔
    • 根据您的全文搜索您的术语

    这就是全文搜索如何以一种简单的方式实现的。无需知道字段名称并对其进行迭代。

    如果您已经实现了将希望搜索的所有文本放入一个“一网打尽”字段的解决方案,为什么要更改它。如果你想改变它,因为它似乎是一个黑客,让我向你保证,这是正确的,最好的解决办法,这个问题。这是和的文档中推荐的模式

    生成一个字段列表并针对所有字段创建一个大而复杂的查询是一项黑客行为。您一定要坚持使用已经实现的解决方案


    若你们是其中一个无法重新编制索引来添加一个包含所有需要搜索的内容的新字段的人,并且你们真的需要一种方法来获取所有字段的列表并对其进行查询,那个么就来吧。您可以很简单地在LeafReader中获取字段列表,而DirectoryReader(例如,来自DirectoryReader.open)包含一个LeafReaderContext列表。因此,遍历LeafReader,并从中获取和合并字段列表,以获取索引中字段的完整列表:

    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);
        }
    }
    
    DirectoryReader=DirectoryReader.open(path.get('/path/to/my/index'));
    HashSet fieldnames=新HashSet();
    for(LeafReaderContext子阅读器:reader.leaves){
    Fields=subReader.reader().Fields();
    for(字符串字段名:字段){
    fieldname.add(fieldname);
    }
    }
    

    您可以在应用程序启动时,或者在重新打开阅读器时,而不是在每次查询时这样做。现在您有了可以传递到的字段名列表,或者可以将一组TermQueries丢弃到BooleanQuery或DisjunctionMaxQuery中,或者诸如此类。

    据我所知,您希望在文档中的所有字段上添加一种全文搜索?谢谢您的解释:)就像我说的,我是Lucene的新手,所以知道我们的方法是正确的,这真的很好。