我使用Nest客户端来使用ElasticSearch。我想在ElasticSearch中搜索:
SearchRequest countRequest = new SearchRequest
{
//Somthing
};
client.Search<Post>(countRequest);
另一方面:
client.Search<Post>(s=>s.Index("IndexName").Query(...))
我如何通过SearchRequest类搜索设置索引名称?
答案 0 :(得分:9)
这适用于使用较新版NEST的用户。在2.0.1中,我无法在Indices
中找到SearchRequest
属性。但是,您可以通过构造函数传递它们:
var request = new SearchRequest<Post>("IndexName", "TypeName");
我在ConnectionSettings
上映射索引和类型。
ConnectionSettings settings = new ConnectionSettings("url");
settings.MapDefaultTypeIndices(t => t.Add(typeof(Post), "IndexName"));
settings.MapDefaultTypeNames(t => t.Add(typeof(Post), "TypeName"));
告诉NEST索引和类型的其他方法:
client.Search<Post>(s => s.Index("IndexName").Type("TypeName").From(0));
或在类型上应用ElasticsearchTypeAttribute
。
[ElasticsearchType(Name = "TypeName")]
public class Post{ }
答案 1 :(得分:2)
SearchRequest
包含Indices
属性,因此您可以指定要搜索的多个索引。在您的情况下,您可以像这样传递单个索引:
var request = new SearchRequest
{
Indices = new IndexNameMarker[] { "IndexName" }
};
另一种选择是将Post
类型映射到它所属的索引,并使用键入的SearchRequest<T>
让NEST推断索引名称。
答案 2 :(得分:2)
我试图用ES v5解决一个不同的任务(json请求是从文件中推出的)但是在设置indexName时也遇到了同样的问题。所以,我的解决方案是添加index
querystring参数。在集成测试中使用它:
public static class ElasticSearchClientHelper
{
public static ISearchResponse<T> SearchByJson<T>(this IElasticClient client, string json, string indexName, Dictionary<string, object> queryStringParams = null) where T : class
{
var qs = new Dictionary<string, object>()
{
{"index", indexName}
};
queryStringParams?.ForEach(pair => qs.Add(pair.Key, pair.Value));
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
var searchRequest = client.Serializer.Deserialize<SearchRequest>(stream);
((IRequestParameters)((IRequest<SearchRequestParameters>)searchRequest).RequestParameters).QueryString = qs;
return client.Search<T>(searchRequest);
}
}
}