В Lucene, почему мои загруженные и не загруженные документы получают одинаковое количество баллов? - PullRequest
6 голосов
/ 26 октября 2011

Во время индексации я повышаю определенный документ следующим образом:

if (myCondition)  
{
   document.SetBoost(1.2f);
}

Но во время поиска документы с одинаковыми качествами, но с некоторыми прохождениями и с ошибками в myCondition, в итоге получают одинаковый счет.

А вот и код поиска:

BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.Add(new TermQuery(new Term(FieldNames.HAS_PHOTO, "y")), BooleanClause.Occur.MUST);
booleanQuery.Add(new TermQuery(new Term(FieldNames.AUTHOR_TYPE, AuthorTypes.BLOGGER)), BooleanClause.Occur.MUST_NOT);
indexSearcher.Search(booleanQuery, 10);

Можете ли вы сказать мне, что мне нужно сделать, чтобы получить документы, которые были увеличены, чтобы получить более высокий балл?

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

Ответы [ 2 ]

6 голосов
/ 09 ноября 2011

Lucene кодирует повышения на один байт (хотя с плавающей точкой обычно кодируется на четыре байта) с помощью метода SmallFloat # floatToByte315.Как следствие, при преобразовании байта в число с плавающей точкой может быть большая потеря точности.

В вашем случае SmallFloat.byte315ToFloat(SmallFloat.floatToByte315(1.2f)) возвращает 1f, поскольку 1f и 1.2f слишком близки друг к другу.Попробуйте использовать больший импульс, чтобы ваши документы получили разные оценки.(Для примера 1.25 SmallFloat.byte315ToFloat(SmallFloat.floatToByte315(1.25f)) дает 1.25f.)

2 голосов
/ 06 ноября 2011

Вот запрошенная тестовая программа, которая была слишком длинной для публикации в комментарии.

class Program
{
    static void Main(string[] args)
    {
        RAMDirectory dir = new RAMDirectory();
        IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer());

        const string FIELD = "name";

        for (int i = 0; i < 10; i++)
        {
            StringBuilder notes = new StringBuilder();
            notes.AppendLine("This is a note 123 - " + i);

            string text = notes.ToString();

            Document doc = new Document();
            var field = new Field(FIELD, text, Field.Store.YES, Field.Index.NOT_ANALYZED);

            if (i % 2 == 0)
            {
                field.SetBoost(1.5f);
                doc.SetBoost(1.5f);
            }
            else 
            {
                field.SetBoost(0.1f);
                doc.SetBoost(0.1f);
            }

            doc.Add(field);
            writer.AddDocument(doc);
        }

        writer.Commit();

        //string TERM = QueryParser.Escape("*+*");
        string TERM = "T";

        IndexSearcher searcher = new IndexSearcher(dir);
        Query query = new PrefixQuery(new Term(FIELD, TERM));
        var hits = searcher.Search(query);            
        int count = hits.Length();

        Console.WriteLine("Hits - {0}", count);

        for (int i = 0; i < count; i++)
        {
            var doc = hits.Doc(i);
            Console.WriteLine(doc.ToString());

            var explain = searcher.Explain(query, i);
            Console.WriteLine(explain.ToString());
        }
    }
}
...