NEST.net Client

NEST.net Client For Elasticsearch简单应用

由于最近的一个项目中的搜索部分要用到 Elasticsearch 来实现搜索功能,苦于英文差及该方面的系统性资料不好找,在实现时碰到了不少问题,现把整个处理过程的代码分享下,给同样摸索的人一些借鉴,同时希望有经验的大牛发现有问题的地方不吝斧正!

查询入口

webapi 的部分代码,把查询条件封装到 eJobQueryPosition 中

var param = new eJobQueryPosition
            {
                IndustryPost = industryPost,
                Region = region,
                MinSalary = minSalary,
            };

//调用搜索

var gl = await _queryBusiness.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 部分代码

var resultData = await _queryPostion.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;

// or  query = (query1 || query2) && query3;

//说明 各条件 || 等同 query 中的should; && 等同 must

//部分搜索条件可改用filter性能会更好,略

*/
        }

/// <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;

参考资料网址

http://nest.azurewebsites.net/nest/core/

时间: 2024-12-21 03:41:24

NEST.net Client的相关文章

(转)NEST.net Client For Elasticsearch简单应用

由于最近的一个项目中的搜索部分要用到 Elasticsearch 来实现搜索功能,苦于英文差及该方面的系统性资料不好找,在实现时碰到了不少问题,现把整个处理过程的代码分享下,给同样摸索的人一些借鉴,同时希望有经验的大牛发现有问题的地方不吝斧正! 查询入口 webapi 的部分代码,把查询条件封装到 eJobQueryPosition 中 var param = new eJobQueryPosition            {                IndustryPost = ind

Elasticsearch的学习笔记

在介绍Elasticsearch的用法之前先讲讲为什么要用它吧.首先学习搜索引擎,肯定不可避免的都听过lucene,solr和Elasticsearch都是基于它的.spinx文章很多,但是数据库的入侵性太强(插件模式).Elasticsearch是当下最流行的分布式搜索引擎之一.solr也稍微玩过,文章也多.同时也希望能通过Elasticsearch进一步学习完善自己对于分布式的学习.更深入的同学可以考虑开始学习ELK(Elasticsearch, Logstash, Kibana). 推荐:

(转)Elasticsearch .net client NEST使用说明 2.x

Elasticsearch.Net与NEST是Elasticsearch为C#提供的一套客户端驱动,方便C#调用Elasticsearch服务接口.Elasticsearch.Net是较基层的对Elasticsearch服务接口请求响应的实现,NEST是在前者基础之上进行的封装.本文是针对NEST的使用的总结. 引用 Install-Package NEST 包含以下dll NEST.dll Elasticsearch.Net.dll   Newtonsoft.Json.dll 概念 存储结构:

Elasticsearch .net client NEST使用说明 2.x

Elasticsearch .net client NEST使用说明 2.x 引用 Install-Package NEST Connection链接 //单node Var node = new Uri(“……”); var settings = new ConnectionSettings(node); //多node Var nodes = new Uri [] { new Uri(“……”), new Uri(“……”) }; //多node Var nodes = new Node [

ElasticSearch NEST笔记

1. 什么是ElasticSearch? ElasticSearch is a powerful open source search and analytics engine that makes data easy to explore. 可以简单理解成索引加检索的工具,当然它功能多于此.ElasticSearch分为服务端与客户端,服务端提供REST API,客户端使用REST API. 2.怎么安装Elastic? 安装JDK(下载地址) 安装ElasticSearch(下载地址) 解压

Elasticsearch(八)【NEST高级客户端--Mapping映射】

要使用NEST与Elasticsearch进行交互,我们需要能够将我们的解决方案中的POCO类型映射到存储在Elasticsearch中的反向索引中的JSON文档和字段.本节介绍NEST中可用的所有不同功能,使POCO和Elasticsearch变得轻而易举. 在Elasticsearch中显式映射文档对于为给定的问题域提供定制搜索解决方案至关重要.虽然Elasticsearch能够基于遇到的该类型的第一个文档来推断索引中给定类型的映射,但推测的映射有时不足以构建一个非常优秀的搜索体验. 要显式

Elastic Search 5.x Nest Multiple Queries C#

I'm using C# with those nuget packeges; <package id="Elasticsearch.Net" version="5.2.0" targetFramework="net462" /> <package id="NEST" version="5.2.0" targetFramework="net462" /> <

ElasticSearch.net NEST批量创建修改删除索引完整示例

本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改索引,都是发起一个request新增或修改一条数据,当一次性修改几千条数据时,发起的requst请求过多容易导致429 Too Many Request的错误,单个新增修改索引就非常不适用.其实Nest有批量新增.修改索引的功能,批量删除也可以.现将项目中采用Elasticsearch的C#代码分享

Elasticsearch NEST – Examples for mapping between Query and C#

Elasticsearch NEST – Examples for mapping between Query and C# During my training with Elasticsearch I would like to map a query with GET/POST method to C# syntax of NEST. It's very helpful for me to see how NEST composes its internal queries and sen