Если вы уже внедрили решение поместить весь текст, который вы хотите найти, в одно поле для всеохвата, почему вы хотите изменить его. Если вы хотите изменить его, потому что это похоже на взлом, позвольте мне заверить вас, что это правильное, лучшее решение этой проблемы. Это шаблон, рекомендуемый в документации как Solr , так и ElasticSearch .
Создание списка полей и создание большого, сложного запроса ко всем из них - это взлом. Вы обязательно должны придерживаться решения, которое вы уже внедрили.
Если вы одна из бедных, несчастных душ , которые просто не могут переиндексировать, чтобы добавить новое поле со всем, что вам нужно искать, и вам действительно нужен способ получить список все поля и запрос к ним, здесь вы идете. Вы можете получить список полей в 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, или что-то подобное.