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

时间:2020-02-25 15:46:50

标签: c# elasticsearch nest

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

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

我可以使用以下方法循环/滚动所有文档:

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

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

请注意,这适用于其他字段。因此,我目前的预感是,这样的事情对Ids来说不起作用。

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

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

根据Russ Cam的要求。我尝试了以下操作,但也无效:

{{1}}

1 个答案:

答案 0 :(得分:0)

我不确定这会如何表现,但应该按照自己的意愿做。

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

这将返回以bla结尾的小写字母,如果需要区分大小写的字符串,则可以执行不区分大小写的正则表达式或应用规范化器。 另外,您可以将reverse令牌过滤器与n-gram一起使用,这应该是最快的方法。