Как искать по всем полям? - программирование
Подтвердить что ты не робот

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

В Lucene мы можем использовать TermQuery для поиска текста с полем. Мне интересно, как искать ключевое слово через кучу полей или все поля, доступные для поиска?

4b9b3361

Ответ 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