我是 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( 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(
final AtomicReaderreader = searcher.getAtomicReader((;
final FieldInfosinfos = reader.getFieldInfos((;(4.2.1节(
-
。或者是否有一种方法(不一定是多字段查询解析器(提供搜索所有字段而不带其名称(v. 6.2.1(?
如果您已经实现了将所有要搜索的文本放入一个包罗万象字段中的解决方案,为什么要更改它。如果您想更改它,因为它看起来像一个黑客,让我向您保证,这是解决此问题的正确,最佳解决方案。这是Solr和ElasticSearch文档中推荐的模式。
生成字段列表并针对所有字段创建大型复杂查询是黑客。您绝对应该坚持使用已经实施的解决方案。
如果你是一个贫穷的、不幸的灵魂,只是无法重新索引以添加一个包含你需要搜索的所有内容的新字段,并且你真的需要一种方法来获取所有字段的列表并针对它们进行查询,那么在这里你去。您可以简单地获取LeafReader中的字段列表,并且DirectoryReader(例如来自DirectoryReader.open(包含LeafReaderContexts的列表。因此,遍历 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);
}
}
您可以在应用程序启动时或重新打开读取器时执行此操作,而不是每次查询时都执行此操作。现在,您有了字段名称列表,您可以将这些字段名称传递到MultiFieldQueryParser中,或者将一堆TermQuery放入BooleanQuery或DisjunctionMaxQuery中,或者诸如此类。
根据您的问题,我建议您只想搜索一些术语,并且实际索引此值的字段并不重要吗?
在这种情况下,最好的方法是根据 elasticsearch 或 solr 能够处理这个问题的结构来实现正常的全文搜索:
- 为每个文档添加专用的"全文"文本字段(文本字段用于全文搜索( 用
- 其他字段的所有信息填充全文字段,用空格分隔 根据您的
- 全文搜索您的术语 f
这就是以简单方式实现全文搜索的方式。无需知道字段名称并迭代这些字段名称。