您的位置:首页 > Web前端 > HTML5

怒写一篇基于Windows10的最新ElasticSearch5.3的搜索引擎的开发博客(一)

2017-04-06 19:18 309 查看
做的有点累,但还是要怒写一篇研究几天的搜索引擎。

废话不多说,这里是5.3版本的,其他版本不保证。特别是2.X版本,具有颠覆性的改变

在此首先感谢http://blog.csdn.net/napoay/article/details/53581027姚攀的博客指导。

此处有中文文档https://es.xiaoleilu.com/030_Data/10_Index.html

我下载的是https://github.com/searchbox-io/Jest的项目,可以自己DownLoad ZIP,然后把pom文件里面的test改为compile。所有项目正常之后

参考http://blog.csdn.net/vinegar93/article/details/53223819写自己的测试用例,注意jest项目没有src/main/resources目录,可以自己新建然后添加自己所需要的配置文件,比如索引、类型、IP地址和端口等。建议新手可以先在test测试用每个测试用例来证明方法的可行性。

WC,也许有些人还不知道怎么安装。首先,我们说下载中文分词器:https://github.com/medcl/elasticsearch-analysis-ik  但是一定要注意版本对应的问题。

在这个releases里可以找你下载的elasticsearch对应的ik版本。解压到本地把带有config这一层的目录所有文件拷贝到ES(elasticsearch安装目录)的plugins(与bin目录平级)下的ik目录(如果没有手动创建)下。把ES的config下面的elasticsearch.yml文件里面的相应属性取消注释并改造,如下:

cluster.name: yfb-joe

node.name: node-101

network.host: 0.0.0.0

http.port: 9200

#这里是连接插件head的时候需要的,当然用dos直接install的不需要。前面的ik也可以直接dos里面install安装到plugins下面

http.cors.enabled: true

http.cors.allow-origin: "*"

head插件可以在网上下载对应版本,其中的Gruntfile.js里面修改对应的

connect: {
server: {
options: {
port: 9100,
hostname: '*',
base: '.',
keepalive: true
}
}
}

然后在_site的app.js下修改对应的

this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";

然后点击启动ES的bin下的elasticsearch.bat就可以启动,然后在head的_site同级别目录也就是安装目录按住shift+鼠标右键,输入grunt server.两者无误后在浏览器输入http://localhost:9100(直接install安装插件的可以http://localhost:9100/plugins/head)即可出现对应的集群状态。默认五个分片一个副本。其中集群健康已经相应的curl操作请看API文档。你可以在head插件中进行创建索引、类型和其他相应操作。创建一个索引之后,我们来测试IK中文分词器是否可以正常运行,在复合查询选项里面输入
http://localhost:9200/index/_analyze?analyzer=ik_max_word&text=中华人民共和国/    然后选择GET,清空参数栏,然后提交请求。得到如图结果。

哈哈,是不是和我当时一样来一句卧槽?莫担心,更坑孩儿的在后面。

一切基本操作,我们可以在head里面实现,但是自动运行的程序不是让你人工天天用右手去敲的。下面我们介绍用java来操作。

经过自己一番TEST测试成功之后,要嵌入自己的程序,你需要提取出来,这时候Test的@Before和@After里面内容可以用动态代理代替(反正你最终要用动态代理的),如图



如此一来,开启jestClient和关闭jestClient就不用管了。

有个createIndex方法可以创建索引和类型。还有个createIndexMapping你可以自己传json字符串来创建,比如你现在创建了index索引名和fulltext类型。你想给里面的字段做一个限定或者规范,

{

  "fulltext": {

    "_all": {

      "analyzer": "ik_max_word",

      "search_analyzer": "ik_max_word",

      "term_vector": "no",

      "store": "false"

    },

    "properties": {

        "name": {

        "type": "string",

        "store": "yes",

        "analyzer": "ik_max_word",

        "search_analyzer": "ik_max_word"

      },

       "id": {

        "type": "integer",

        "store": "yes"

      },

    }

  }

}

这里大致解释一下,_all即全局,store表示存储与否,name和id是需要规范的字段,analyzer即指定分词器,5.X版本的ES的string是分成了text和keyword,前者可分词后者不可分词。这里要作为一个字符串传入,则需要对特殊字符进行转义。好在有json在线转义,把这段复制进去,点击压缩并转义即可以直接复制到字符串中来。如下

{\"fulltext\":{\"_all\":{\"analyzer\":\"ik_max_word\",\"search_analyzer\":\"ik_max_word\",\"term_vector\":\"no\",\"store\":\"false\"},\"properties\":{\"name\":{\"type\":\"string\",\"store\":\"yes\"},\"id\":{\"type\":\"integer\",\"store\":\"yes\"}}}}

也许有人问,为什么name可以指定分词器而id不行呢,因为id不能进行中文分词,而且当type设置为keyword类型的时候,也不能进行中文分词。

定义好规范之后可以朝里面插入数据了,这个数据自己造。比如下面

然后用“中华人民共和国”去queryString()来鉴定是不是成功使用了中文分词器,如果出现了“中午的时候遇见一个华侨3”和“中国外媒遇见一个华侨4”,说明你的分词还是用的标准的分词器即一个个拆分的,提醒一点数字不做中文分词。

至于一些分页参数自己封装,只不过一些实参转形参的过程。一些关系层的构建都看个人水平了。只要功能实现,其他都好说。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐