如何防止弹性搜索 Nest 客户端将 poco 名称作为 slug 注入 URI 进行搜索?

How do I prevent the elastic search Nest client from injecting the poco name as a slug in the URI for a search?

下面的代码将生成一个包含 POCO 名称的 uri
(https://demo.com/query/slug1/myIndexName/myPoco/_search).
我需要的只是 https://demo.com/query/slug1/myIndexName/_search

var node = new Uri("https://demo.com/query/slug1/");
var settings = new ConnectionSettings(node, defaultIndex: "myIndexName");

int skipCount = 0;
int takeSize = 100;

var client = new ElasticClient(settings);

do
{
    var searchResults = client.Search<myPoco>(x => x.Index("myIndexName")
        .Query(q => q
        .Bool(b => b
        .Must(m =>
            m.Match(mt1 => mt1.OnField(f1 => f1.status).Query("New")))))
        .Skip(skipCount)
        .Take(takeSize));

    foundStuff = (List<myPoco>)searchResults.Documents;

    foreach (foundThing item in searchResults.Documents)
    {
        //DO stuff
    }

    skipCount = skipCount + takeSize;
} while (foundStuff.Count == 100);

我是不是漏掉了一些简单的东西,还是这个 AFU?

这不是 AFU :) NEST will infer the type name 将通用参数类型包含在 URI 中传递给 Search<T>()。您可以使用 .AllTypes()

轻松覆盖它
var searchResults = client.Search<myPoco>(x => x
    .Index("myIndexName")
    // specify all types
    .AllTypes()
    .Query(q => q
    .Bool(b => b
    .Must(m =>
        m.Match(mt1 => mt1.OnField(f1 => f1.status).Query("New")))))
    .Skip(skipCount)
    .Take(takeSize)
);

请记住,这现在将搜索索引中的 所有类型 ,并尝试将每个类型反序列化为 myPoco 类型。

针对您的评论,indextype 是两个不同的概念,因此如果您将类型命名为与索引相同,您仍然会得到 ~/{index}/{type}/_search。与 NEST

您可以在连接设置

上为具有.MapDefaultTypeIndices()的类型映射默认索引
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
    .MapDefaultTypeIndices(d => d.Add(typeof(myPoco), "myIndexName"));

同样,您可以为类型映射默认类型名称

var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
    .MapDefaultTypeNames(d => d.Add(typeof(myPoco), "myType"));

你可以滥用这个来映射string.Empty作为你的类型的默认类型名称来获得你想要的URI