当前位置: 首页 > 面试题库 >

当在通配符类型中使用通配符时,DocumentExists()失败

滕夜洛
2023-03-14
问题内容

使用Type通配符的Update()也存在该问题,但是我发现DocumentExists()的作用相同,因此在此将问题简化如下:

这有效…

var docExists = client.DocumentExists<object>(d => d
    .Index(indexname)
    .Id(myId)
    .Type("Abcdef"));

但这失败了

var docExists = client.DocumentExists<object>(d => d
    .Index(indexname)
    .Id(myId)
    .Type("Abc*"));

如果我完全省略Type,它也会失败。有人知道如何进行这项工作吗?(即使不管文档的类型如何都可以,对我而言还是可以的。)


问题答案:

据我所知,不可能在类型名称中指定通配符,但是您可以做一些技巧。

您可以在索引中查询具有特定ID的文档,并使用前缀过滤器来缩小对某些类型的搜索范围。

var searchResponse = client.Search<dynamic>(s => s
    .Type(string.Empty)
    .Query(q => q.Term("id", 1))
    .Filter(f => f.Prefix("_type", "type")));

这是完整的示例:

class Program
{
    static void Main(string[] args)
    {
        var indexName = "sampleindex";

        var uri = new Uri("http://localhost:9200");
        var settings = new ConnectionSettings(uri).SetDefaultIndex(indexName).EnableTrace();
        var client = new ElasticClient(settings);

        client.DeleteIndex(descriptor => descriptor.Index(indexName));

        client.CreateIndex(descriptor => descriptor.Index(indexName));

        client.Index(new Type1 {Id = 1, Name = "Name1"}, descriptor => descriptor.Index(indexName));
        client.Index(new Type1 {Id = 11, Name = "Name2"}, descriptor => descriptor.Index(indexName));
        client.Index(new Type2 {Id = 1, City = "City1"}, descriptor => descriptor.Index(indexName));
        client.Index(new Type2 {Id = 11, City = "City2"}, descriptor => descriptor.Index(indexName));
        client.Index(new OtherType2 {Id = 1}, descriptor => descriptor.Index(indexName));

        client.Refresh();

        var searchResponse = client.Search<dynamic>(s => s
            .Type(string.Empty)
            .Query(q => q.Term("id", 1))
            .Filter(f => f.Prefix("_type", "type")));

        var objects = searchResponse.Documents.ToList();
    }
}

class Type1
{
    public int Id { get; set; }
    public string Name { get; set; }
}

class Type2
{
    public int Id { get; set; }
    public string City { get; set; }
}

class OtherType2
{
    public int Id { get; set; }
}

对全局没有太多了解,但是也许您可以更改解决方案以使用索引而不是类型?您可以将通配符放在索引名称中。



 类似资料:
  • 问题内容: 这是来自 HeadFirst Java的 :(第575页) 这个: 做与此相同的事情: 所以这是我的问题:如果它们完全相同,我们为什么不写 要么 另外,什么时候使用?是有用的?而不是使用泛型的方法声明(如上所述)中的T或用于类声明?有什么好处? 问题答案: 之间的最大区别 和 是在前一种方法中,您可以在方法中将“ T”作为给出的具体类。在第二种方法中,您无法执行此操作。 这里有一个更复

  • 问题内容: 是否可以在方法的返回参数中使用通用通配符类型,这是否可行? 换句话说,确实可以像下面这样声明一个接口: 另外,可以说通用通配符类型仅在方法的 参数声明 时才有意义吗? 问题答案: 使用通配符类型(例如在方法正式参数中)的主要好处是为用户提供了灵活性,使其可以传递任何类型的,或任何实现Collection的东西(假设collection声明为)。您通常会发现自己在形式参数中使用通配符类型

  • 问题内容: 如果我说: 我得到了ActionListener类。如果我说: 我得到的事件类 包括 ActionListener吗?或者更好: 我认为,如果像上两个示例中那样包含一个类,则可以有效地导入该类并继承其所有子类。但是,例如,当我仅使用最后一行时,Eclipse经常显示错误,表明它无法解析某些项目,并建议我 同时 包含java.awt和java.awt.event。 问题答案: Java中

  • 问题内容: 我正在运行应该执行方法的Shell脚本: 在这一点上,我得到这个异常: 这是因为弹簧罐位于另一个文件夹中。所以我更改了脚本: 但是,使用此脚本无法找到com.example.ClassTest。关于这个问题有什么想法吗? 提前致谢 问题答案: Java类路径通配符扩展不常见。 从文档: 了解类路径通配符 类路径条目可以包含基本名称通配符,这被认为等效于指定目录中所有扩展名为.jar或.

  • null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。

  • 所以我看了官方的java教程,https://docs.oracle.com/javase/tutorial/java/generics/index.html,也搜索了stackoverflow,结果发现使用