Lucene 6.2.1 Как получить все имена полей или выполнить поиск по всем полям, не зная их имен - PullRequest
0 голосов
/ 04 июля 2018

Я новичок в Lucene, и я хотел бы знать, есть ли способ поиска по всем возможным полям в нескольких документах, не зная их имен или ... другой подход: получить все имена полей (версия 6.2.1 )

  1. Например: Как получить все имена из массива ' fields ' и не заполнять их, как в примере ниже

    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);
    

    Я уже проверил эти темы:

    а) Как искать во всех полях?

    Мы реализовали этот ответ:

    1) Подход с индексным временем: используйте поле всеобщего охвата. Это всего лишь добавление всего текста из всех полей (всего текста из вашего входного документа) и размещение полученного огромного текста в одном поле. Вы должны добавить дополнительное поле при индексации, чтобы действовать в качестве универсального поля.

    но мы хотели бы изменить его, если есть возможность

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

    в) IndexReader.getFieldNames Lucene 4

    но этих решений нет в Lucene версии 6.2.1

    IndexReader.getFieldNames () (v. 3.3.0)

    final AtomicReader reader = searcher.getAtomicReader ();

    final FieldInfos infos = reader.getFieldInfos (); (v. 4.2.1)

  2. ... или есть метод (не обязательно MultiFieldQueryParser), который обеспечивает поиск по всем полям без их имен (v. 6.2.1)?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

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

0 голосов
/ 05 июля 2018

Исходя из вашего вопроса, я предлагаю вам просто поискать некоторые термины и поля, в которых эти значения фактически проиндексированы, разве не важно знать?

В этом случае наилучшим подходом будет реализация обычного полнотекстового поиска, основанного на структуре, с помощью которойasticsearch или solr способны справиться с этим:

  • Добавить выделенный «полный текст» TextField к каждому документу (TextField используется для полнотекстового поиска)
  • заполнить полнотекстовое поле всей информацией о других полях, разделенных пробелом
  • Поиск по вашему термину на основе вашего полного текста f

Вот как полнотекстовый поиск может быть легко реализован. Нет необходимости знать имена полей и перебирать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...