2013-03-02 3 views
14

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

ответ

9

Два подхода

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

2) Подход поиска: используйте BooleanQuery для объединения нескольких запросов, например экземпляров TermQuery. Эти несколько запросов могут быть сформированы для охвата всех целевых полей.

Example проверка в конце статьи.

Используйте подход 2, если вы знаете список целевых полей во время выполнения. В противном случае вы должны использовать первый подход.

+0

Спасибо за хорошее большую картину объяснения. Первый подход - это то, что я использую при хранении различных типов продуктов в одном индексе, например, «Принтеры и мониторы», где для каждого документа существуют разные поля, но я хочу использовать «полнотекстовый» поиск с помощью простой строки поиска и возвращать все продуктов, которые соответствуют. – nothingisnecessary

20

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

+0

MultiFieldQueryParser - это изящный подход .. :) – phani

+0

Спасибо, ваш ответ тоже неплохой;) +1 – javanna

3

Другим простым подходом к поиску по всем полям с использованием «MultifieldQueryParser» является использование IndexReader.FieldOption.ALL в вашем запросе.

Вот пример в C#.

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; 

click here проверить мой проницаемый ответ на тот же quesiton в vb.net

+0

Я не вижу смысла использовать утку, набрав здесь (т. Е. Ключевое слово 'dynamic'). Может быть, вы хотели использовать типовое взаимодействие с 'var'? –

Смежные вопросы