搜索弹性搜索以特定字符串结尾的 ID

Search elastic search for Ids ending with specific string

我摄取了这种简化格式的文档:

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

我可以 loop/scroll 使用此方法处理所有文档:

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

是否可以只关注 ID 以特定字符串结尾的文档 - 例如: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))
        )
    )
)
; 

请注意,这适用于其他字段。所以我目前的直觉是,像这样的东西对 IDs 不起作用。

Filip Cordas 建议使用正则表达式。这也不行:

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$")
        )
   )
)
;

我不确定它的性能如何,但应该做你想做的。

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

这将 return 以 bla 结尾的小写术语,如果需要区分大小写的字符串,您可以执行不区分大小写的正则表达式或应用规范化程序。 您也可以使用 reverse token filter with an n-gram,应该是最快的方法。