В Lucene мы можем использовать TermQuery для поиска текста с полем. Мне интересно, как искать ключевое слово через кучу полей или все поля, доступные для поиска?
Как искать по всем полям?
Ответ 1
Другой подход, который не требует индексации ничего большего, чем то, что у вас уже есть, и не сочетать разные запросы, использует MultiFieldQueryParser
.
Вы можете предоставить список полей, в которые вы хотите выполнить поиск, и ваш запрос, что все.
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
Version.LUCENE_41,
new String[]{"title", "content", "description"},
new StandardAnalyzer(Version.LUCENE_41));
Query query = queryParser.parse("here goes your query");
Так я бы сделал это с оригинальной библиотекой lucene, написанной на Java. Я не уверен, доступен ли MultiFieldQueryParser
в lucene.net тоже.
Ответ 2
Два подхода
1) Индексный подход: используйте поле catch-all. Это не что иное, как добавление всего текста из всех полей (общий текст из вашего входного документа) и размещение в нем огромного текста в одном поле. Вы должны добавить дополнительное поле, в то время как индексирование будет действовать как поле catch-all.
2) Подход поиска: используйте BooleanQuery для объединения нескольких запросов, например экземпляров TermQuery. Эти несколько запросов могут быть сформированы для охвата всех целевых полей.
Пример проверить в конце статьи.
Используйте подход 2, если вы знаете список целевых полей во время выполнения. В противном случае вы должны использовать первый подход.
Ответ 3
Еще один простой подход к поиску по всем полям с помощью MultifieldQueryParser" используется IndexReader.FieldOption.ALL в ваш запрос.
Вот пример в С#.
Directory directory = FSDirectory.Open(new DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath)));
//get analyzer
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
//get index reader and searcher
IndexReader indexReader__1 = IndexReader.Open(directory, true);
Searcher indexSearch = new IndexSearcher(indexReader__1);
//add all possible fileds in multifieldqueryparser using indexreader getFieldNames method
dynamic queryParser = new MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer);
dynamic query = queryParser.Parse(Criteria);
TopDocs resultDocs = null;
//perform search
resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc());
dynamic hits = resultDocs.scoreDocs;
нажмите здесь, чтобы проверить мой предыдущий ответ на тот же вопрос в vb.net