NEST.net Client For Elasticsearch簡單應用
由于最近的一個項目中的搜尋部分要用到 Elasticsearch 來實作搜尋功能,苦于英文差及該方面的系統性資料不好找,在實作時碰到了不少問題,現把整個處理過程的代碼分享下,給同樣摸索的人一些借鑒,同時希望有經驗的大牛發現有問題的地方不吝斧正!
查詢入口
webapi 的部分代碼,把查詢條件封裝到 eJobQueryPosition 中
var param = new eJobQueryPosition
{
IndustryPost = industryPost,
Region = region,
MinSalary = minSalary,
};
//調用搜尋
QueryPositionsAsync(param, skip, top, string.Empty);
//處理結果
if (gl.IsError)
return FailActionRequest(gl.webapi_error);
if (gl.total <= 0)
{
return OkActionRequest(gl);
}
return OkListActionRequest(gl);
QueryPositionsAsync 部分代碼
QueryAsync(condition, skip, top, searchText);
//檢視搜尋語句
//var temp= Encoding.UTF8.GetString(resultData.RequestInformation.Request).Trim();
if (!resultData.Hits.Any())
{
return new GListResult<eJobPositionSimple>(new eJobPositionSimple[0]);
}
var result = resultData.Documents;
var g1 = result.Select(position => new eJobPositionSimple
{
Pstn_Id = position._id,
...
Phone = position.Phone,
Name = position.BrandName,
}).ToList();
return new GListResult<eJobPositionSimple>(g1, (int) resultData.Total);
QueryAsync部分代碼
/// <summary>
/// 生成搜尋用戶端
/// </summary>
/// <returns></returns>
private static ElasticClient
GetSearchClient()
{
var connectString = ConfigurationManager.ConnectionStrings["ElasticSearch"].ConnectionString;
var nodesStr = connectString.Split('|');
var nodes = nodesStr.Select(s => new Uri(s)).ToList();
var connectionPool = new SniffingConnectionPool(nodes);
var settings = new ConnectionSettings(connectionPool).SetDefaultIndex("position");
settings.SetDefaultPropertyNameInferrer(p => p.ToString());
var client = new ElasticClient(settings);
return client;
}
//web.config 中 ElasticSearch 的設定 <add name="ElasticSearch" connectionString="http://192.168.1.7:7200" /> //預設為9200端口
public async Task<ISearchResponse<QPosition>>
QueryAsync(eJobQueryPosition condition, int skip, int top, string searchText = "")
{
var client =
GetSearchClient();
var resultData = await client.
SearchAsync<QPosition>(s =>
s.Index("position").Type("tbJobPosition").
Query(
q =>
QueryContainerPosition(condition, searchText, q)).
SortDescending(f => f.UpdateTime).Skip(skip).Take(top));
return resultData;
}
/// <summary>
/// 生成職位查詢表達式
/// </summary>
/// <param name="condition">職位條件</param>
/// <param name="searchText">查詢的關鍵字</param>
/// <param name="q">用于傳回的查詢表達式</param>
/// <returns>傳回用于搜尋的表達式</returns>
private static QueryContainer
QueryContainerPosition(eJobQueryPosition condition, string searchText, QueryDescriptor<QPosition> q)
{
var query = new QueryContainer();
//未過有效期
query &= q.Range(rr => rr.OnField(ff => ff.ExpireTime).GreaterOrEquals(DateTime.UtcNow.Date));
if (!string.IsNullOrWhiteSpace(searchText))
{
query &=
QueryText(searchText, q, query);
}
return query;
var query1 = new QueryContainer();
query1 = q.Term(s => s.OnField(ff => ff.BrandName).Value("szbrandname1"));
var query2 = new QueryContainer();
query2 = q.Term(s => s.OnField(ff => ff.BrandName).Value("szbrandname2"));
var query3 = new QueryContainer();
query2 = q.Term(s => s.OnField(ff => ff.BrandName).Value("szbrandname3"));
query = query1 || query2 || query3;
query = (
query1 || query2)
&&
query3;
//說明 各條件 || 等同 query 中的should; && 等同 must
*/
}
/// <summary>
/// 搜尋文本表達式,一定要放在所有表達式的最後
/// </summary>
/// <param name="searchText">搜尋文本</param>
/// <param name="q">搜尋表達式</param>
/// <param name="query">要傳回的搜尋表達式類</param>
/// <returns></returns>
private static QueryContainer
QueryText(string searchText, QueryDescriptor<QPosition> q, QueryContainer query)
{
if (!string.IsNullOrWhiteSpace(searchText))
{
query = q.MatchPhrase(p => p.OnField(o => o.Descript).Query(searchText));
}
return query;
}
以上代碼分别放到相應的cs檔案中即可實作postion的搜尋功能
部分應用要加哦
using System;
using System.Configuration;
using System.Linq;
using System.Threading.Tasks;
using **.Entity;
using Elasticsearch.Net.ConnectionPool;
using Nest;
參考資料網址