Как отсортировать результат на основе количества обращений в эластичном поиске NEST

Я использую NEST (С#) для связи с Elasticsearch. Однако результаты не основаны на количестве попаданий, как я могу отсортировать свои результаты на основе количества попаданий, а также я получаю только 10 записей. Ниже мой пример кода

var result = client.Search(q => q
                               .Index(IndexName)
                               .From(0)
                               .Type("post")
                               .Fields("title","message")
                               .Size(10)
                               .Query(fq1 => fq1
                                  .QueryString(fqqs1 => fqqs1
                                    .OnFieldsWithBoost(d => d
                                      .Add("title", 7.0)
                                      .Add("message", 5.0))
                                      .Query(SearchQuery))));

мое поле message будет содержать большой текст, возможно ли получить только несколько строк вокруг ключевого слова поиска из сообщения, как в результатах поиска Google


person user2757044    schedule 10.04.2014    source источник
comment
Что касается получения фрагмента поля сообщения, взгляните на выделение — nest.azurewebsites. сеть/гнездо/search/highlighting.html   -  person Paige Cook    schedule 10.04.2014
comment
они указали, какой тег мы можем добавить только до и после ключевого слова, а не о получении нескольких строк из содержимого сообщения, когда я использую .Fields("title","message") API, возвращающий полный контент   -  person user2757044    schedule 10.04.2014
comment
Правильно, если вы добавите выделение, результаты будут в отдельном свойстве Highlights в ответе. Это даст вам только фрагмент всего поля... См. полную документацию Highlights для Elasticsearch — elasticsearch.org/guide/en/elasticsearch/reference/current/, и все эти параметры, такие как .FragmentSize, можно установить с помощью NEST.   -  person Paige Cook    schedule 10.04.2014
comment
да ты прав . я получил фрагмент поля сообщения под подсветкой, но возможно ли получить его в самом исходном поле, потому что я конвертирую свой результат в строку, используя var jsonData = "{\"search\":[" + string.Join(",", queryResult.Documents.ToArray()) + "]}";, и я скрываю его в своем объекте класса, используя var finaleResult = (client.Serializer.Deserialize<Result>(jsonData)).result, поэтому мне нужно получить выделенный контент в самом исходном поле , Как мне это сделать ?   -  person user2757044    schedule 11.04.2014


Ответы (1)


Привет, чтобы отсортировать по количеству просмотров, просто используйте

var result = client.Search(q => q
                 .Index(IndexName)
                 .From(0)
                 .Type("post")
                 .Fields("title","message")
                 .TrackScores(true)
                 .Size(10)
                 .Query(fq1 => fq1
                        .QueryString(fqqs1 => fqqs1
                            .OnFieldsWithBoost(d => d
                                .Add("title", 7.0)
                                .Add("message", 5.0)
                            )
                            .Query(SearchQuery)
                        )
                 .Sort(sort => sort.OnField("_score").Descending())
           );

Чтобы получить больше записей, просто увеличьте число в Size()

person danvasiloiu    schedule 02.02.2015
comment
Вы также можете использовать sort => sort.Descending(SortSpecialField.Score), чтобы не полагаться на волшебные строки. - person Jeff Putz; 11.03.2019