【问题标题】:Search elastic search for Ids ending with specific string搜索以特定字符串结尾的 Id 的弹性搜索
【发布时间】:2020-03-03 17:50:15
【问题描述】:

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

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

请注意,这适用于其他字段。所以我目前的预感是,这样的事情对 Id 不起作用。

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# elasticsearch nest


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。对不起,但这也不起作用。我编辑了我的问题并将其添加为另一个非工作示例。
  • @cs0815 您能否在字段和 ID 示例上发布分析器,正则表达式是基于术语的,因此可能是标记化问题
  • @cs0815 你应该删除 MatchAll
猜你喜欢
  • 1970-01-01
  • 2018-08-24
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多