首页 > 解决方案 > 搜索以特定字符串结尾的 Id 的弹性搜索

问题描述

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

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

我可以使用这个循环/滚动所有文档:

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

标签: c#elasticsearchnest

解决方案


我不确定这将如何表现,但应该做你想做的事。

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

这将返回以 bla 结尾的小写术语,如果需要区分大小写的字符串,您可以执行不区分大小写的正则表达式或应用规范器。您也可以使用带有n-gram的反向标记过滤器,这应该是最快的方法。


推荐阅读