ScorePayload не вызывается на CustomS Similarity - PullRequest
1 голос
/ 28 апреля 2020

Я следил за этой записью в блоге, но в люцене. net:

https://lucidworks.com/post/getting-started-with-payloads/

Вот так выглядит мое сходство:

public class PayloadSimilarity : DefaultSimilarity
{
    public override float ScorePayload(int doc, int start, int end, BytesRef payload) 
    {
        var score = PayloadHelper.DecodeSingle(payload.Bytes, start);

        return score;
    }
}

Затем, как упоминается в сообщении в блоге, я установил сходство для поисковика, а также для индексатора. В Luke я вижу, что полезная нагрузка есть. И если я ищу полезные данные, это ничего мне не возвращает, поэтому я думаю, что полезные данные есть, но Searcher не учитывает их.

Я использую Query Parser с комбинацией Searcher и пользовательское сходство.

Объяснение показывает, что использовалось мое пользовательское сходство, но не показывает, что использовалось ScorePayload, и, конечно, оно не нарушается в функции ScorePayload, если я ставлю точку останова.

Заранее спасибо за вашу помощь!

PS: И вот как я строю Анализатор:

    public static Analyzer WithTermBasedBoosting(char delimiter) => CustomAnalyzer
        .WithTokenizer("WhitespaceTokenizer")
        .AddTokenFilter("DelimitedPayloadTokenFilter")
        .With(delimiter,new SingleEncoder())
        .Build();

Ради простоты я создал другой Анализатор с Наименьшее количество вещей:

    public static Analyzer MyDelimited(char delimiter) => Analyzer.NewAnonymous(createComponents: (fieldName, reader) =>
    {
        Tokenizer source = new WhitespaceTokenizer(CustomAnalyzer.Version, reader);

        TokenStream filter = new DelimitedPayloadTokenFilter(source, delimiter, new SingleEncoder());

        return new TokenStreamComponents(source, filter);
    });

1 Ответ

1 голос
/ 28 апреля 2020

Кажется, что ответ был прост, вы не можете использовать обычный QueryParser, так как он не учитывает полезную нагрузку. Я обнаружил тип QueryTerm, а именно PayloadTermQuery, и теперь мой Query выглядит следующим образом:

public List<ResultModel> Query(string indexName,string searchTerm, int top = 100, float score = 2f)
        {
            var searcher = GetSearcher(indexName);

            //Query query = new QueryParser(Version, IndexFields.Text, _queryAnalyzer).Parse(searchTerm);

            Query query = new PayloadTermQuery(new Term(IndexFields.Text, "GMBH"), new AveragePayloadFunction());

            var rowsToReturn = top == 0 ? int.MaxValue : top;

            var hits = searcher.Search(query, rowsToReturn).ScoreDocs;

            return hits.Where(x => x.Score >= score)
                .Select(hit => hit.ToResultModel(searcher, query))
                .ToList();
        }

Однако было бы здорово использовать QueryParser с комбинацией CustomS Similarity.

...