在Nest中通过SearchRequest类设置索引名称

时间:2014-09-12 19:17:42

标签: c# .net elasticsearch nest

我使用Nest客户端来使用ElasticSearch。我想在ElasticSearch中搜索:

SearchRequest countRequest = new SearchRequest
{
  //Somthing
};

client.Search<Post>(countRequest);

另一方面:

client.Search<Post>(s=>s.Index("IndexName").Query(...))

我如何通过SearchRequest类搜索设置索引名称?

3 个答案:

答案 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);
        }
    }
}