Влияние предельного значения Elasticsearch в запросе с несколькими совпадениями - PullRequest
0 голосов
/ 02 марта 2020

У меня есть запрос на совпадение с пятью различными полями. Я хочу ограничить степень влияния этого запроса с множественным соответствием на общий запрос, чтобы, если по какой-либо причине одно из полей было только что заселено поисковыми запросами, оно не получило значительную оценку , То, что я хочу, это разлагающее воздействие. Я просмотрел документацию и изо всех сил пытаюсь найти способ сделать это. Я обнаружил, что документы сценариев распада (https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/function-score-query-usage.html), но все они, похоже, указывают c на одно поле, которое мне не очень помогает, так как я хочу применить его к множественному совпадению query.

Вот запрос, для которого я хочу ограничить влияние:

new MultiMatchQuery
{
    Type = TextQueryType.MostFields,
    Fields = Field<SearchableTour>(f => f.Name, 0.5)
        .And(Field<SearchableTour>(f => f.StartCity, 0.1))
        .And(Field<SearchableTour>(f => f.FinishCity, 0.1))
        .And(Field<SearchableTour>(f => f.Description, 0.05))
        .And(Field<SearchableTour>(f => f.ItineraryText, 0.01)),
    Query = searchText,
    Operator = Operator.And
}

Базовые данные не контролируются мной, и кто-то теоретически может просто заполнить одно из этих полей обычным поиском. условия искусственно повысить свой результат до вершины. Я хочу предотвратить это, но все же позволю этим полям оказывать ограниченное влияние. Кажется, что не существует понятия «максимальный балл», который позволил бы мне ограничить комбинированный балл для этих полей.

1 Ответ

0 голосов
/ 02 марта 2020

Я думаю, вы на правильном пути. Вы должны иметь возможность просто подключить свой MultiMatchQuery к части запроса по указанной вами ссылке, а затем предоставить любые функции оценки, которые вы хотите. Однако обратите внимание, что предоставляемые функции затухания предназначены для числовых полей c, date или geo_location, поэтому вы, вероятно, не сможете их использовать. Вероятно, я бы сделал что-то вроде этого:

new FunctionScoreQuery()
{
    Query = new MultiMatchQuery{ ... },
    ScoreMode = FunctionScoreMode.Sum,
    Functions = new List<IScoreFunction>
    {
        new ScriptScoreFunction { Script = new InlineScript(##YourDecayFunction(_score)##) }
    }
}
...