Lucene.NET и ищущий на нескольких полях с определенными значениями

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

Позже, когда я приезжаю для поиска индекса, я должен запросить его с точным полем / значения - например:

FieldName1 = X AND FieldName2 = Y AND FieldName3 = Z

Что является лучшим способом создать следующее использование Lucene.NET:

  • Что анализатор является лучшим для использования для этого типа точного совпадения?
  • После получения соответствия мне только нужно одно определенное поле, которое будет возвращено (который я добавляю к каждому документу) - это должно быть единственным сохраненным?
  • Позже я должен буду поддерживать поиск по ключевым словам (таким образом, поле сможет иметь список значений, и я должен буду сделать частичное соответствие).

Поля и значения прибывают из a Dictionary<string, string>. Это не ввод данных пользователем, это создается из кода.

Спасибо,
Kieron

7
задан Kieron 30 March 2010 в 14:43
поделиться

1 ответ

Что ж, в конце концов я понял это - вот мой взгляд на это (это может быть совершенно неверно, но это работает):

public Guid? Find (Dictionary<string, string> searchTerms)
{
    if (searchTerms == null)
        throw new ArgumentNullException ("searchTerms");

    try
    {
            var directory = FSDirectory.Open (new DirectoryInfo (IndexRoot));
            if (!IndexReader.IndexExists (directory))
                return null;

            var mainQuery = new BooleanQuery ();
            foreach (var pair in searchTerms)
            {
                var parser = new QueryParser (
                    Lucene.Net.Util.Version.LUCENE_CURRENT, pair.Key, GetAnalyzer ());
                var query = parser.Parse (pair.Value);

                mainQuery.Add (query, BooleanClause.Occur.MUST);
            }

            var searcher = new IndexSearcher (directory, true);

            try
            {
                var results = searcher.Search (mainQuery, (Filter)null, 10);
                if (results.totalHits != 1)
                    return null;

                return Guid.Parse (searcher.Doc (results.scoreDocs[0].doc).Get (ContentIdKey));
            }
            catch
            {
                throw;
            }
            finally
            {
                if (searcher != null)
                    searcher.Close ();
            }
    }
    catch
    {
            throw;
    }
}
7
ответ дан 7 December 2019 в 07:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: