ElasticSearch(站内搜索)

Posted 风浪子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch(站内搜索)相关的知识,希望对你有一定的参考价值。

简介

  Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。Elasticsearch是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。
  Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
  • 实时分析的分布式搜索引擎。
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

安装:Window安装(转载)

  1. 下载Elasticsearch,地址:elasticsearch.org/download 
  2. 下载jdk,百度搜索jdk下载即可
  3. 配置JAVA_HOME变量,配置方法在此文:http://jingyan.baidu.com/article/9113f81b0ceae22b3214c7e1.html
  4. 解压elasticsearch,打开cmd命令窗口,定位到bin目录,然后执行elasticsearch.bat 即可。
  5. 最后在浏览器中打开:http://localhost:9200/?pretty 效果如下:
  6. 插件head安装方法
  7. 首先下载head.zip 地址:https://github.com/mobz/elasticsearch-head
  8. 然后在elasticsearch安装目录下的plugins文件夹下建立head文件夹
  9. 将下载后的head文件copy到head文件夹下
  10. 运行es,在浏览器中打开:http://localhost:9200/_plugin/head/ 出现这个界面就可以。

使用:

1、Nuget下载安装 plainelastic.net 第三方类库;

2、编写ElasticSearchHelper类:

using PlainElastic.Net;
using PlainElastic.Net.Queries;
using PlainElastic.Net.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace BookMgr
{
    public class ElasticSearchHelper
    {
        public static readonly ElasticSearchHelper Intance = new ElasticSearchHelper();

        private ElasticConnection Client;

        private ElasticSearchHelper()
        {
            Client = new ElasticConnection("192.168.1.8", 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、MVC中调用ElasticSearchHelper类:

        [HttpPost]
        public ActionResult BMsg(Book DataModel)
        {
            DataModel.BookWriteTime = DateTime.Now;
            DBBookMgr.BooksOpeart(DataModel, OpeartOption.NEW);

            var result = ElasticSearchHelper.Intance.Index("db_book", "searchbook", DataModel.Id.ToString(), DataModel);       

            return View(DataModel);
        }

看下效果图:使用框架(MVC5+Dapper+ElasticSearch)

4、参考博客:
ElasticSearch的安装:http://www.cnblogs.com/panzi/p/5659697.html

ElasticSearch系列学习: http://www.cnblogs.com/eggTwo/p/4039779.html

ElasticSearch使用:http://blog.csdn.net/wulex/article/details/52144145

 演示代码下载

 

5、未完待续内容:
ElasticSearch中文分词查询的处理

 

以上是关于ElasticSearch(站内搜索)的主要内容,如果未能解决你的问题,请参考以下文章

基于 ElasticSearch 实现站内全文搜索,写得太好了!

基于 ElasticSearch 实现站内全文搜索,写得太好了。。。

solr 学习片段

ElasticSearch入门

CentOS7 下安装 ElasticSearch 5.x 及填坑

Elasticsearch介绍,一些概念的笔记