elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

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

C# 搜索弹性搜索以特定字符串结尾的ID,c#,elasticsearch,nest,C#,elasticsearch,Nest,我接受了这种简化格式的文件: public class Document { public string Id { get; set; } } 我可以使用以下方法循环/滚动所有文档: client.Search<Document> ( scr => scr.Index(IndexName) .From(0) .Size(100) .MatchAll() .Scroll(scrollTimeout)

我接受了这种简化格式的文件:

public class Document
{
    public string Id { get; set; }
}
我可以使用以下方法循环/滚动所有文档:

client.Search<Document>
(
    scr => scr.Index(IndexName)
        .From(0)
        .Size(100)
        .MatchAll()
        .Scroll(scrollTimeout)
)
;
client.Search
(
scr=>scr.Index(IndexName)
.从(0)
.尺寸(100)
.MatchAll()
.滚动(滚动超时)
)
;
是否可以只关注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")
        )
    )
)
; 
returnclient.Search
(
scr=>scr.Index(IndexName)
.从(0)
.尺寸(100)
.MatchAll()
.Scroll(scrollTimeout).Query(q=>q
.Match(m=>m
.Field(f=>f.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)
)
returnclient.Search
(
scr=>scr.Index(IndexName)
.从(0)
.尺寸(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$")
        )
    )
)
; 
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$")
        )
   )
)
;
returnclient.Search
(
scr=>scr.Index(IndexName)
.从(0)
.尺寸(100)
.MatchAll()
.Scroll(scrollTimeout).Query(q=>q
.通配符(c=>c
.Name(“命名查询”)
.Boost(1.1)
.Field(p=>p.Id)
.价值(“bla”)
.重写(MultiTermQueryRewrite.TopTermsBoost(10))
)
)
)
; 
请注意,这适用于其他字段。因此,我目前的直觉是,类似的内容不适用于ID

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

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$")
        )
    )
)
; 
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$")
        )
   )
)
;
returnclient.Search
(
scr=>scr.Index(IndexName)
.从(0)
.尺寸(1000)
.MatchAll().Scroll(滚动超时).Query(q=>q
.Regexp(c=>c
.Field(p=>p.Id)
.价值(“bla$”)
)
)
)
; 
根据Russ Cam的要求,我尝试了以下方法,但同样无效:

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$")
        )
    )
)
; 
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$")
        )
   )
)
;
var searchResponses=client.Search
(
scr=>scr.Index(indexName)
.从(0)
.尺寸(1000)
.Query(q=>q.Regexp(c=>c
.Field(p=>p.Id)
.价值(“bla$”)
)
)
)
;

我不确定这会有多好,但应该做你想做的事

q
.Regexp(c => c
    .Field(p => p.Id)
    .Value("bla$")
)
这将返回以bla结尾的小写术语,如果需要区分大小写的字符串,可以执行不区分大小写的正则表达式或应用规范化程序。
此外,您还可以将令牌筛选器与一起使用,这应该是最快的方法。

我不确定它的性能如何,但应该按照您的要求执行

q
.Regexp(c => c
    .Field(p => p.Id)
    .Value("bla$")
)
这将返回以bla结尾的小写术语,如果需要区分大小写的字符串,可以执行不区分大小写的正则表达式或应用规范化程序。
您还可以将令牌筛选器与一起使用,这应该是最快的方法。

请查看,谢谢。尝试了此操作,但遇到了“获取错误请求”错误。您能否建议代码?这可能更有用,还包括一个示例try.Query(“*bla”)这不起作用…请看一看谢谢。尝试了这个,但遇到了tbh-get bad request错误。您能推荐代码吗?这可能更有用,还包括一个示例try.Query(“*bla”)这不起作用…谢谢。很抱歉,这也不起作用。我编辑了我的问题,并将其作为另一个不起作用的示例添加。@cs0815您能在字段上发布分析器吗?ID示例,regex是基于术语的,因此它可能是一个标记化issue@cs0815你应该删除MatchAllThank。很抱歉,这也不起作用。我编辑了我的问题并将其作为另一个不起作用的示例添加。@cs0815您能在字段和ID示例上发布分析器吗?regex是基于术语的,因此它可以是一个标记化issue@cs0815你应该删除MatchAll