天天看點

NEST.net Client For Elasticsearch簡單應用

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;      

參考資料網址

繼續閱讀