Подход поискового индекса Lucene.NET - PullRequest
1 голос
/ 31 марта 2010

Я пытаюсь собрать тестовый пример для использования Lucene.NET на одном из наших веб-сайтов. Я хотел бы сделать следующее:

Индекс в одном уникальном идентификаторе. Индексировать через строку с разделителями-запятыми терминов или тегов.

Например.

Элемент 1: Id = 1 Тэги = что-то, разделенные-срок

Затем я структурирую поиск, чтобы можно было искать документы по тегу, т. Е.

теги: что-то ИЛИ теги: отдельный термин

Мне нужно сохранить точное значение термина для поиска по нему.

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

Мой анализатор (_luceneAnalyzer передается в мою службу индексации):

var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_CURRENT, "Tags", _luceneAnalyzer);
parser.SetDefaultOperator(QueryParser.Operator.AND);
return parser;

Создание моего документа Lucene.NET:

var doc = new Document();

var id = new Field(
    "Id",
    NumericUtils.IntToPrefixCoded(indexObject.id),
    Field.Store.YES,
    Field.Index.NOT_ANALYZED,
    Field.TermVector.NO);

var tags = new Field(
    "Tags",
    string.Join(",", indexObject.Tags.ToArray()),
    Field.Store.NO,
    Field.Index.ANALYZED,
    Field.TermVector.YES);

doc.Add(id);
doc.Add(tags);

return doc;

Мой поиск:

var parser = BuildQueryParser();
var query = parser.Parse(searchQuery);
var searcher = Searcher;

TopDocs hits = searcher.Search(query, null, max);
IList<SearchResult> result = new List<SearchResult>();
float scoreNorm = 1.0f / hits.GetMaxScore();

for (int i = 0; i < hits.scoreDocs.Length; i++)
{
    float score = hits.scoreDocs[i].score * scoreNorm;
    result.Add(CreateSearchResult(searcher.Doc(hits.scoreDocs[i].doc), score));
}

return result;

У меня есть два документа в моем индексе, один с тегом "Что-то" и один с тегами "Что-то" и "Отдельный термин" Для ... важно оставаться в терминах, так как я хочу точное совпадение по полной стоимости.

Когда я выполняю поиск по тегам: что-то, я не получаю никаких результатов.

Вопрос

Какой анализатор я должен использовать для получения поискового индекса, который мне нужен? Есть ли какие-нибудь указатели для того, чтобы собрать подобный поиск? Почему мой текущий поиск не возвращает никаких результатов?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 06 апреля 2010

Похоже, вы можете добавить в документ несколько полей с одинаковым именем, поэтому я изменил свой код на:

foreach (string tag in vehicle.Tags)
{
    var tags = new Field(
        TAGS,
        tag,
        Field.Store.YES,
        Field.Index.ANALYZED,
        Field.TermVector.YES);

    doc.Add(tags);
}

Теперь я могу выполнять поиск по одному или нескольким тегам в поле «Теги».

0 голосов
/ 31 марта 2010

Несколько идей для размышления:

  1. Попробуйте выполнить поиск "Теги: что-то" (в вашем примере вы опускали имя поля "Теги")
  2. Я думаю, вам понадобится анализатор для каждого поля: один для "Id" и один для "Тегов
  3. Luke - действительно хороший инструмент для изучения индексов и запросов (он отлично работает с данными, созданными Lucene.net)

Надеюсь, это поможет,

...