Поиск elasti c поиск идентификаторов, заканчивающихся на строку c - PullRequest
1 голос
/ 25 февраля 2020

Я принял документы этого упрощенного формата:

public class Document
{
    public string Id { get; set; }
}

Я могу циклически прокручивать / прокручивать все документы, используя это:

client.Search<Document>
(
    scr => scr.Index(IndexName)
        .From(0)
        .Size(100)
        .MatchAll()
        .Scroll(scrollTimeout)
)
;

Можно ли сосредоточиться только на документах, где Идентификаторы заканчиваются указанной строкой c - например, bla?

Я пробовал это:

return client.Search<Document>
(
    scr => scr.Index(IndexName)
    .From(0)
    .Size(100)
    .MatchAll()
    .Scroll(scrollTimeout).Query(q => q
        .Match(m => m
        .Field(f => f.Id)
        .Query("bla")
        )
    )
)
; 

Также пробовал:

return client.Search<Document>
(
    scr => scr.Index(IndexName)
    .From(0)
    .Size(100)
    .MatchAll()
    .Scroll(scrollTimeout).Query(q => q
        .MoreLikeThis(sn => sn
        .Fields(ff => ff
            .Field(f => f.Id)
)

Использование подстановочного знака также не работает:

return client.Search<Document>
(
    scr => scr.Index(IndexName)
    .From(0)
    .Size(100)
    .MatchAll()
    .Scroll(scrollTimeout).Query(q => q
        .Wildcard(c => c
        .Name("named_query")
        .Boost(1.1)
        .Field(p => p.Id)
        .Value("bla")
        .Rewrite(MultiTermQueryRewrite.TopTermsBoost(10))
        )
    )
)
; 

Обратите внимание, что это работает с другими полями. Итак, мое текущее предположение состоит в том, что что-то подобное просто не работает для идентификаторов.

Филип Кордас предложил использовать регулярные выражения. Это также не работает:

return client.Search<Document>
(
    scr => scr.Index(IndexName)
    .From(0)
    .Size(1000)
    .MatchAll().Scroll(scrollTimeout).Query(q => q
        .Regexp(c => c
        .Field(p => p.Id)
        .Value("bla$")
        )
    )
)
; 

По запросу Russ Cam. Я попробовал следующее, которое также не работало:

var searchResponses = client.Search<Document>
(
    scr => scr.Index(indexName)
        .From(0)
        .Size(1000)
        .Query(q => q.Regexp(c => c
            .Field(p => p.Id)
            .Value("bla$")
        )
   )
)
;

1 Ответ

0 голосов
/ 26 февраля 2020

Я не уверен, насколько эффективным будет это, но должен делать то, что вы хотите.

q
.Regexp(c => c
    .Field(p => p.Id)
    .Value("bla$")
)

Это вернет строчные термины, которые заканчиваются на bla, если нужны строки, чувствительные к регистру, вы можете сделать кейс нечувствительное регулярное выражение или применять нормализатор. Также вы можете использовать токен-фильтр reverse с n-грамм , это самый быстрый способ сделать это.

...