【问题标题】:Search for a specific query (TermsQuery) without type-specific class in NEST在 NEST 中搜索没有特定类型类的特定查询 (TermsQuery)
【发布时间】:2018-08-12 04:27:11
【问题描述】:

第一次使用 ElasticSearch(使用 NEST 作为包装器)。我想在外部 ElasticSearch 数据库中进行搜索。

我只想对名为cvrNummer 的特定字段运行测试查询。我有以下代码,因为:The type arguments for method 'ElasticSearch.Search<T> .. ', cannot be inferred from the usage.

我认为这是因为我无法指定特定类型的类。挑战是我不知道那个。

我的问题是:我如何运行下面的查询,而不确切知道我得到了什么(以制作特定类型的模型)?如果我需要那个模型,在缺少文档的情况下如何“制作”那个模型?

我的代码:

        var settings = new ConnectionSettings(new Uri(_path)).
        BasicAuthentication(_username,_password);

        var client = new ElasticClient(settings);

        var es_query = new TermsQuery
        {
            Name = "named_query",
            Boost = 1.1,
            Field = "cvrNummer",
            Terms = new string[] { "36406208" }
        };

        client.Search(es_query);

只有我有的文档

curl -u "<brugernavn>:<password>" -XPOST http://URL -d'
{ "from" : 0, "size" : 1,
  "query": {
    "term": {
      "cvrNummer": VALUE
    }
  }
}

编辑更多数据:

来自文档的文档模型:

curl -u "<brugernavn>:<password>" -XGET http://distribution.virk.dk/cvr-permanent/_mapping

完整搜索示例:

curl -u "<brugernavn>:<password>" -XPOST http://distribution.virk.dk/cvr-permanent/_search -d'
{ "from" : 0, "size" : 1,
  "query": {
    "term": {
      "cvrNummer": 10961211
    }
  }
}
'

【问题讨论】:

  • 试试这样的:client.Search&lt;dynamic&gt;(s =&gt; s.From(0).Size(1).Query(q =&gt; q.Terms(t =&gt; t.Name("named_query").Boost(1.1f).Field("cvrNummer").Terms("36406208"))));
  • @Evk 谢谢!这将导致:“'索引名称对于给定类型为空,并且未设置默认索引。使用 ConnectionSettings.DefaultMappingFor() 映射索引名称或使用 ConnectionSettings.DefaultIndex() 设置默认索引。'”。任何想法? :-)
  • curl“文档”中的完整 url 看起来如何(路径部分,在域之后)?
  • @Evk 刚刚更新了更多数据 :-) 感谢提问
  • 那就试试s =&gt; s.From(0).Size(1).Index("cvr-permanent").AllTypes().(... the rest of the above...)

标签: c# elasticsearch nest elasticsearch-net


【解决方案1】:

您可以将“文档” curl 请求转换为 C# api 语法,如下所示:

client.Search<dynamic>(s => s //dynamic because you don't know the structure
    .From(0)
    .Size(1)
    .Index("cvr-permanent") // index you are searching, taken from url of curl
    .AllTypes() // search all types in that index
    .Query(q => q.Terms(t => 
         t.Name("named_query")
        .Boost(1.1f)
        .Field("cvrNummer")
        .Terms("36406208"))));

如果你不喜欢dynamic - 你可以使用JObject,如果你使用dynamic,这将是Search返回的真实类型:

var response = client.Search<JObject>(...);

然后你可以像这样访问匹配的文档:

foreach (var document in result.Documents) {
    // if you used `JObject`:
    Console.WriteLine(document["account_number"]);
    // if you used `dynamic`:
    Console.WriteLine(document.account_number);
}

如果您使用JObject,您还可以在生成的JObject 上调用ToString()(因此,在上面的示例中为document.ToString())查看返回文档的完整json,以便您了解其结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多