如何防止弹性搜索 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
类型。
针对您的评论,index
和 type
是两个不同的概念,因此如果您将类型命名为与索引相同,您仍然会得到 ~/{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
下面的代码将生成一个包含 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
类型。
针对您的评论,index
和 type
是两个不同的概念,因此如果您将类型命名为与索引相同,您仍然会得到 ~/{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