результат семантического поиска на ява люцене - PullRequest
1 голос
/ 29 марта 2011

Я реализовал скрытый семантический анализ в Lucene

Результатом алгоритма является матрица из 2 столбцов, где первый - это индекс документа, а второй - сходство.

Что я хочу написать ответ в org.apache.lucene.search.Collector для метода поиска Searcher, но я не знаю, как установить результат в объекте сборщика.

код для поискаМетод:

    public void search(Weight weight, Filter filter, Collector collector) throws IOException                
{
    String textQuery = weight.getQuery().toString("contents");
    System.out.println(textQuery);
    double[][] ind;
    ind = lsa.searchOnDoc(textQuery);
    //ind contains the index and the similarity
    if (ind != null)
    {
        //construct the collector object
        for (int i=0; i<ind.length; i++)
        {
            int doc =(int) ind[i][0];
            double simi = ind[i][1]
            //collector.collect(doc);
            //collector.setScorer(sim]);
            //This is the problem
        }
    }
    else
    {
        collector = null;
    }
}

Я не знаю правильных шагов, чтобы скопировать значение ind в объект коллектора.

Можете ли вы помочь мне?

1 Ответ

0 голосов
/ 01 апреля 2011

Я не совсем понимаю, почему вы решили засунуть LSI в Searcher.
И получение вашего текстового запроса из Weight выглядит особенно теневым - почему бы не использовать вместо этого исходный запрос и пропустить все) преобразования?

Но Collector обрабатывается следующим образом.
Для каждого сегмента в вашем индексе:

  1. Предоставьте ему соответствующий SegmentReader с collector.setNextReader(reader, base).Вы можете получить их с помощью ir.getSequentialSubReaders() и ir.getSubReaderStarts() на считывателе верхнего уровня.Так,

    • reader может использоваться collector для загрузки полей сортировки / кэшей во время сбора и дополнительных полей для дополнения результата поиска, когда сбор завершен,
    • base - это число, добавляемое к сегменту / локальным docID (они начинаются с 0 для каждого сегмента), чтобы преобразовать их в индекс / глобальные docID.
  2. Предоставить ему Scorer реализацию с collector.setScorer(scorer).
    collector , может использовать его на следующем этапе, чтобы получить счетдля документов.Хотя, если сборщик только считает результаты, или сортирует по некоторому сохраненному полю, или просто чувствует себя так - scorer будет проигнорировано.
    Единственный метод, который сборщики методов вызывают на экземпляре Scorer, это scorer.score(), который должен возвращать счет(Я не шучу) для текущего собираемого документа.

  3. Повторно вызывайте collector.collect(id) с монотонно возрастающей последовательностью сегментов / локальных docID, которые соответствуют вашему запросу.

Возвращаясь к вашему коду - создайте какую-нибудь оболочку, которая реализует Scorer, используйте один экземпляр с полем, которое вы обновляете с помощью simi на каждой итерации, у вас есть оболочка score()метод возвращает это поле, поместите этот экземпляр в коллектор с помощью setScorer() перед циклом.

Вам также нужно lsa.searchOnDoc, чтобы получить результаты для каждого сегмента.

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