使用plainelastic elasticsearch实现搜索业务plainelastic.net实例教程
作者:佳明妈 来源:web前端开发 2016-08-18 人气:本文介绍使用plainelastic elasticsearch先介绍api使用方法,然后给出一个实现搜索业务的一个plainelastic.net实例教程 1、PlainElastic.Net下载 1)源码下载:https://github.com/Yegoroff/PlainElastic.Net 2)通
本文介绍使用plainelastic elasticsearch先介绍api使用方法,然后给出一个实现搜索业务的一个plainelastic.net实例教程
1、PlainElastic.Net下载
1)源码下载:https://github.com/Yegoroff/PlainElastic.Net
2)通过NuGet Packages下载
备注:通过这种方式下载,有可能因为PlainElastic.Net引用的Newtonsoft.Json.dll版本与原有项目中的不一致到报错,因此建议下载源码,将源码中的Newtonsoft.Json.dll版本更换为当前项目的版本
2、封装PlainElastic.Net帮助类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using PlainElastic.Net; using PlainElastic.Net.Queries; using PlainElastic.Net.Serialization; namespace Amy.Toolkit.PlainElastic { public class ElasticSearchHelper { public static readonly ElasticSearchHelper Intance = new ElasticSearchHelper(); private ElasticConnection Client; private ElasticSearchHelper() { Client = new ElasticConnection("localhost", 9200); } /// <summary> /// 数据索引 /// </summary> /// <param name="indexName">索引名称</param> /// <param name="indexType">索引类型</param> /// <param name="id">索引文档id,不能重复,如果重复则覆盖原先的</param> /// <param name="jsonDocument">要索引的文档,json格式</param> /// <returns>索引结果</returns> public IndexResult Index(string indexName, string indexType, string id, string jsonDocument) { var serializer = new JsonNetSerializer(); string cmd = new IndexCommand(indexName, indexType, id); OperationResult result = Client.Put(cmd, jsonDocument); var indexResult = serializer.ToIndexResult(result.Result); return indexResult; } /// <summary> /// 数据索引 /// </summary> /// <param name="indexName">索引名称</param> /// <param name="indexType">索引类型</param> /// <param name="id">索引文档id,不能重复,如果重复则覆盖原先的</param> /// <param name="jsonDocument">要索引的文档,object格式</param> /// <returns>索引结果</returns> public IndexResult Index(string indexName, string indexType, string id, object document) { var serializer = new JsonNetSerializer(); var jsonDocument = serializer.Serialize(document); return Index(indexName, indexType, id, jsonDocument); } /// <summary> /// 全文检索 /// </summary> /// <typeparam name="T">搜索类型</typeparam> /// <param name="indexName">索引名称</param> /// <param name="indexType">索引类型</param> /// <param name="query">查询条件(单个字段或者多字段或关系)</param> /// <param name="from">当前页(0为第一页)</param> /// <param name="size">页大小</param> /// <returns>搜索结果</returns> public SearchResult<T> Search<T>(string indexName, string indexType, QueryBuilder<T> query, int from, int size) { var queryString = query.From(from).Size(size).Build(); var cmd = new SearchCommand(indexName, indexType); var result = Client.Post(cmd, queryString); var serializer = new JsonNetSerializer(); return serializer.ToSearchResult<T>(result); } } }
3、在control中的实现
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using PlainElastic.Net; using PlainElastic.Net.Queries; using Amy.WebUI.Controllers; namespace Amy.WebUI.Areas.Admin.Controllers { public class SearchController : BasicController { /// <summary> /// 创建索引/更新索引 /// </summary> public ActionResult AddIndexByPlainElastic(Models.SearchObject model) { if (string.IsNullOrEmpty(model.Id)) { model.Id = IDHelper.Id32; } model.DateTime = DateTime.Now; var result = Amy.Toolkit.PlainElastic.ElasticSearchHelper.Intance.Index("db_test", "searchobject", model.Id, model); return JRCommonHandleResult(!string.IsNullOrEmpty(result._id)); } /// <summary> /// 搜索数据 /// </summary> public ActionResult SearchByPlainElastic(string key, int page = 0) { #region 定义查询内容 var query = new QueryBuilder<Models.SearchObject>() //查询,多字段匹配(Title和Content匹配key中的任意一个单词) .Query(x => x.QueryString(t => t.Fields(obj => obj.Title, obj => obj.Content).Query(key)) ) //过滤,数据为启用状态并且大小在40~150之间 .Filter(x => x.And(w=> w.Term(t => t .Field(obj => obj.IsEnable).Value("true") ) .Range(t => t .Field(obj => obj.Size).From("40").To("150") ) ) ) //排序,按照时间倒序排列 .Sort(x => x.Field("DateTime", SortDirection.desc)) //高亮,定义高亮样式及字段 .Highlight(h => h .PreTags("<b>") .PostTags("</b>") .Fields( f => f.FieldName("Title").Order(HighlightOrder.score), f => f.FieldName("Content").Order(HighlightOrder.score), f => f.FieldName("_all") ) ); #endregion var result = Amy.Toolkit.PlainElastic.ElasticSearchHelper.Intance.Search<Models.SearchObject>("db_test", "searchobject", query, page, 10); #region 拼装查询内容 var list = result.hits.hits.Select(c => new Models.SearchObject() { Id = c._source.Id, Title = c.highlight == null ? c._source.Title : c.highlight.Keys.Contains("Title") ? string.Join("", c.highlight["Title"]) : c._source.Title, //高亮显示的内容,一条记录中出现了几次 Content = c.highlight == null ? c._source.Content : c.highlight.Keys.Contains("Content") ? string.Join("", c.highlight["Content"]) : c._source.Content, //高亮显示的内容,一条记录中出现了几次 Size = c._source.Size, IsEnable = c._source.IsEnable, DateTime = c._source.DateTime, }).ToPageList(page + 1, 10, result.hits.total); #endregion return JRSuccess(list.ToJsonByJsonNet()); } } }
4、代码中使用到的伪搜索对象
namespace Amy.WebUI.Areas.Admin.Models { public class SearchObject { public string Id { get; set; } public string Title { get; set; } public string Content { get; set; } public int Size { get; set; } public bool IsEnable { get; set; } public DateTime DateTime { get; set; } } }
5、UI测试页面效果
↓ 查看全文
使用plainelastic elasticsearch实现搜索业务plainelastic.net实例教程由懒人建站收集整理,您可以自由传播,请主动带上本文链接
懒人建站就是免费分享,觉得有用就多来支持一下,没有能帮到您,懒人也只能表示遗憾,希望有一天能帮到您。
使用plainelastic elasticsearch实现搜索业务plainelastic.net实例教程-最新评论