hbase伪分布式平台搭建(centos 澳门美高梅手机网站6.3)

  搭建完《hadoop伪分布式平台》后就从头搭建hbase伪分布式平台了。有了hadoop环境,搭建hbase就变得很轻便了。

支付Web应用时,你平日要抬高寻找效果。甚至还不知底要搜什么,就在草图上画了1个放大镜。

  一、Hbase安装

谈起当前Computer的文字搜索在接纳上的落实,象形文字天生就比拼音字母劣势的多,分词、词性剖断、拼音文字调换啥的,轻便令人香菇。

  1、从官方网址下载新颖版本Hbase安装包壹.二.三,为了节约编写翻译安装环节,笔者直接下载了hbase-一.二.叁-bin.tar.gz,解压就可以使用。(若是此链接下载速度过慢可转变官方网址别的下载链接)

首先大家来打听下何以是Inverted
index,翻译过来的名字有多数,比如反转索引、倒排索引什么的,令人不明所以,能够精通为:三个未经处理的数据库中,一般是以文书档案ID作为目录,以文书档案内容作为记录。而Inverted
index
指的是将单词或记录作为目录,将文书档案ID作为记录,那样便足以一本万利地因此单词或记录查找到其所在的文书档案。并不是何等奥秘概念。

[hadoop@master tar]$ tar -xzf hbase-1.2.3-bin.tar.gz 
[hadoop@master tar]$ mv hbase-1.2.3 /usr/local/hadoop/hbase
[hadoop@master tar]$ cd /usr/local/hadoop/hbase/
[hadoop@master hbase]$ ./bin/hbase version
HBase 1.2.3
Source code repository git://kalashnikov.att.net/Users/stack/checkouts/hbase.git.commit revision=bd63744624a26dc3350137b564fe746df7a721a4
Compiled by stack on Mon Aug 29 15:13:42 PDT 2016
From source with checksum 0ca49367ef6c3a680888bbc4f1485d18

oracle里常用的位图索引(Bitmap index)也可感觉是Inverted
index。位图索引对于相异基数低的数量极其适宜,即记录多,但取值较少。比如三个拾0W行的表有三个字段会反复地被当做查询条件,大家会想到在这1列上边建立三个索引,不过这一列只可能取一个值。那么1旦创建多个B*树索引(普通索引)是不相宜的,因为随便查找哪二个值,都恐怕会意识到大多多少,那时就能够设想选择位图索引。位图索引相对于古板的B*树索引,在叶子节点上运用了大相径庭的结构社团办公室法。传统B*树索引将每一行记录保留为三个叶子节点,上面记录对应的索引列取值和行rowid音讯。而位图索引将每一个恐怕的目录取值组织为3个卡牌节点。各种位图索引的卡片节点上,记录着该索引键值的序曲甘休rowid和三个位图向量串。要是不思量起止rowid,那么正是取值有多少个,就有多少个目录,比如上例,虽说有拾0W条记下,可是针对只有2个可取值的字段来讲,索引节点唯有三个,类似于下图:

运营方面命令获得健康输出即表示安装成功,然后配置环境变量

澳门美高梅手机网站 1

  二、配置环境变量

亟需留意的是,由于负有索引字段同值行共享三个索引节点,位图索引不适用于频仍增加和删除改的字段,不然恐怕会变成针对该字段(此外行)的增加和删除改阻塞(对其余非索引字段的操作无影响),是壹种索引段级锁。具体请参见
深入解析B-Tree索引与Bitmap位图索引的锁代价

修改~/.bashrc在PATH前边扩充

下边说说小编明白的部分全文字笔迹查验索的工具。

:$HADOOP_HOME/hbase/bin

文石蟹青文字表示我并不显著描述是或不是科学,藤黄代表作者疑问,若有了解的同室请不吝赐教,多谢!

则~/.bashrc文件内容如下

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$HADOOP_HOME/hbase/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

[hadoop@master hadoop]$ source ~/.bashrc

  二、Hbase单机形式

ICTCLAS分词系统

  一、修改配置文件 hbase/conf/hbase-env.sh 

理所当然想借着ICTCLAS简介下普通话分词的局地法则和算法,但是网桃月有比较好的稿子了,可参考
ICTCLAS分词系统钻研。普通话分词基本上是根据词典,[可能]事关到的知识
——
HMM(隐马尔科夫链)、动态规划、TF-IDF、凸优化,更基础的就是消息论、概率论、矩阵等等,我们在读书的时候或许并不知道所学何用,想较快重温的同室可观察吴军政大学学生的《数学之美》。那个概念小编会择要在再而三博文中牵线。上边我们就来探望分词系统在数据库中的具体选拔。

# export JAVA_HOME=/usr/java/jdk1.6.0/   修改为
export JAVA_HOME=/usr/local/java/

#export HBASE_MANAGES_ZK=true   修改为
export HBASE_MANAGES_ZK=true

# 添加下面一行
export HBASE_SSH_OPTS="-p 322"

  二、修改配置文件 hbase/conf/hbase-site.xml

Postgresql的国语分词

<configuration>     
    <property>
        <name>hbase.rootdir</name>
        <value>file:/usr/local/hadoop/tmp/hbase/hbase-tmp</value>
    </property>
</configuration>

在PostgreSQL中,GIN索引就是Inverted index,GIN索引存款和储蓄一多种(key,
posting list)对, 那里的posting list是1组出现键的行ID。
各种被索引的档次都大概包涵五个键,由此同3个行ID大概汇合世在多少个posting
list中。
各类键值只被积存一次,由此在同1的键出现在众多档次的情况下,GIN索引是充足严密的(来自PostgreSQL
九.4.4普通话手册
)。显明,将之应用到数组类型的字段上是非凡适用的。全文字笔迹查证索类型(tsvector)一样支撑GIN索引,可以加速查询。听大人说玖.六版本出了多少个什么样RUM索引,相比GIN,检索作用获得了非常的大的晋升,可参考
PostgreSQL 全文字笔迹核准索加快 快到未有朋友 –
RUM索引接口(潘多拉魔盒)

  3、启动 Hbase

侥幸的是,阿里云CR-VDS PgSQL已辅助zhparser(基于SCWS)汉语分词插件。

[hadoop@master hbase]$ start-hbase.sh 
starting master, logging to /usr/local/hadoop/hbase/bin/../logs/hbase-hadoop-master-master.out
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0

连接要分词的数据库,实施以下语句:

jps下多了一个HMaster进程  

-- 安装扩展
create extension zhparser;
-- 查看该数据库的所有扩展
select * from pg_ts_parser; 
-- 支持的token类型,即词性,比如形容词名词啥的
select ts_token_type('zhparser'); 
-- 创建使用zhparser作为解析器的全文搜索的配置 
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser); 
-- 往全文搜索配置中增加token映射,上面的token映射只映射了名词(n),动词(v),形容词(a),成语(i),叹词(e)和习惯用语(l)6种,这6种以外的token全部被屏蔽。
-- 词典使用的是内置的simple词典,即仅做小写转换。
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple; 
set zhparser.punctuation_ignore = t; -- 忽略标点符号
[hadoop@master hbase]$ jps
12178 ResourceManager
11540 NameNode
4277 Jps
11943 SecondaryNameNode
12312 NodeManager
11707 DataNode
3933 HMaster

未来我们就能够便宜的张开汉语分词了,比如“select
to_tsvector(‘testzhcfg’,’苏州市黄河大桥’);”,会拆分为“’常州市’:1 ‘尼罗河大桥’:二”。若是要分的更加细粒度,那么能够安装复合分词,复合分词的等第:一~1伍,按位异或的
一|2|四|八 依次表示 短词|贰元|重要字|全体字,缺省不复合分词,那是SCWS的布局选项,对应的zhparser选项为zhparser.multi_short、zhparser.multi_duality、zhparser.multi_zmain、zhparser.multi_zall。比如大家要安装短词复合分词,那么就set
zhparser.multi_short=on;那么“select
to_tsvector(‘testzhcfg’,’徐州市黄河大桥’);”获得的分词结果将是“’卢布尔雅那’:二’宿迁市’:一 ‘桥梁’:伍 ‘亚马逊河’:4’亚马逊河大桥’:三”,这样就足以合营到更加多的显要词,当然检索作用会变慢。

  4、使用Hbase shell

短词复合分词是依照词典来的,比如词典中有’一遍性’、’贰回性使用’、’’2遍性使用吸痰管’、’使用’、’吸痰管’多少个词语,当multi_short=off时,select
to_tsvector(‘testzhcfg’,'”1次性使用吸痰管”‘);再次回到最大相配的”2遍性使用吸痰管”,而为on时,重返的是”‘3次性’:2’3次性使用吸痰管’:一 ‘应用’:三 ‘吸痰管’:四”,让人纳闷的是,结果里从未领到出’贰回性使用’这一个词,不知怎么回事。

[hadoop@master hbase]$ hbase shell
2016-11-07 10:11:02,187 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/hbase/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.3, rbd63744624a26dc3350137b564fe746df7a721a4, Mon Aug 29 15:13:42 PDT 2016

hbase(main):001:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 2.0000 average load

hbase(main):002:0> exit

在成品表上建一列tsv存储产品名称的tsvector值,并对该列建GIN索引。

未运维Hbase直接动用Hbase Shell会报错

CREATE OR REPLACE FUNCTION func_get_relatedkeywords(keyword text)
  RETURNS SETOF text[] AS
$BODY$
begin
    if (char_length(keyword)>0) then 
        RETURN QUERY select string_to_array(tsv::text,' ') from "Merchandises" where tsv @@ plainto_tsquery('testzhcfg',keyword);
    end if;    
end
$BODY$
  LANGUAGE plpgsql VOLATILE

  5、停止Hbase

注意plainto_tsquery和to_tsquery稍微有点分别,比如前者不认识’:\‘,而后人碰到空格会报错。*

[hadoop@master hbase]$ stop-hbase.sh 
stopping hbase......................

这会回来全体包蕴传加入关贸总协定社团键词的tsvector格式的字符串,所以我们要在业务层分解去重再传递给前端。

  3、Hbase伪分布式

 1 public async Task<ActionResult> GetRelatedKeywords(string keyword)
 2 {
 3     var keywords = await MerchandiseContext.GetRelatedKeywords(keyword);
 4     if(keywords != null && keywords.Count>0)
 5     {
 6         //将所有产品的关键词汇总去重
 7         var relatedKeywords = new List<string>();
 8         foreach(var k in keywords)
 9         {
10             for(int i=0;i<k.Count();i++) //pg返回的是带冒号的tsvector格式
11             {
12                 k[i] = k[i].Split(':')[0].Trim('\'');
13             }
14             relatedKeywords.AddRange(k);//k可以作为整体,比如多个词语作为一个组合加入返回结果,更科学(这里是拆分后独立加入返回结果)
15         }
16         //根据出现重复次数排序(基于重复次数多,说明关联性高的预设)
17         relatedKeywords = relatedKeywords.GroupBy(rk => rk).OrderByDescending(g => g.Count()).Select(g => g.Key).Distinct().ToList();
18         relatedKeywords.RemoveAll(rk=>keyword.Contains(rk));
19         return this.Json(new OPResult<IEnumerable<string>> { IsSucceed = true, Data = relatedKeywords.Take(10) }, JsonRequestBehavior.AllowGet);
20     }
21     return this.Json(new OPResult { IsSucceed = true }, JsonRequestBehavior.AllowGet);
22 }

伪分布式和单机情势的区分首如若陈设文件的例外

now,大家就从头完成了近似各大电商的找寻栏关键词联想功效:

  1、修改配置文件  hbase/conf/hbase-env.sh 

澳门美高梅手机网站 2

# export JAVA_HOME=/usr/java/jdk1.6.0/   修改为
export JAVA_HOME=/usr/local/java/

# export HBASE_MANAGES_ZK=true   修改为
export HBASE_MANAGES_ZK=true

# export HBASE_CLASSPATH=   修改为
export HBASE_CLASSPATH=/usr/local/hadoop/etc/hadoop/

# 添加下面一行
export HBASE_SSH_OPTS="-p 322"

然则,尚有壹些值得考虑的底细。当数据库中产品表更加大,毫无疑问查询时间会变长,纵然大家只必要前边10个关联词,但可能有重复词,所以并不能够轻便的在sql语句前边加limit
10。临时减弱不了查询范围,可以减掉一样关键词的数据库查询频率,即在上层插足缓存。key是重点词或首要词组合,value是涉及关键词,关键词多以来,加上各样组合那么数据量肯定非常的大,所以我们缓存时间要依据数据量和用户寻觅量定个贴切时间。以redis为例:

zookeeper使用Hbase自带的就可以,分布式才有必不可缺开启独立的

 1 public static async Task SetRelatedKeywords(string keyword, IEnumerable<string> relatedKeywords)
 2 {
 3     var key = string.Format(RedisKeyTemplates.MERCHANDISERELATEDKEYWORDS, keyword);
 4     IDatabase db = RedisGlobal.MANAGER.GetDatabase();
 5     var count = await db.SetAddAsync(key, relatedKeywords.Select<string, RedisValue>(kw => kw).ToArray());
 6     if (count > 0)
 7         db.KeyExpire(key, TimeSpan.FromHours(14), CommandFlags.FireAndForget); //缓存
 8 }
 9 
10 public static async Task<List<string>> GetRelatedKeywords(string keyword)
11 {
12     IDatabase db = RedisGlobal.MANAGER.GetDatabase();
13     var keywords = await db.SetMembersAsync(string.Format(RedisKeyTemplates.MERCHANDISERELATEDKEYWORDS, keyword));
14     return keywords.Select(kw => kw.ToString()).ToList();
15 }

  二、修改配置文件 hbase/conf/hbase-site.xml

当用户在找寻栏里输入的不要完全的主要词——输入的文字并未有确切相称到数据Curry的任1tsvector——比如就输入一个“交”可能“锁型”之类,并从未提供用户预期的机关补完作用(即使活动补完和要害词联想本质上是五个不等的意义,可是用户或然并不这么想)。大家通晓,在重点词后加’:*’,比如“交:*”,那么是足以兼容到的,如:select
‘交锁型:二 交锁型股骨重建钉主钉:一 股骨:叁 重建:4’::tsvector @@
to_tsquery(‘交:*’),重临的正是true。但是大家总不可能让用户输入的时候带上:*,在代码里给电动叠加:*是1种缓解格局(select
to_tsquery(‘testzhcfg’,’股骨重建:*’),结果是”‘股骨’:* &
‘重建’:*”),可是会带来大概的频率难点,比如select
to_tsquery(‘testzhcfg’,’二次性使用吸痰管:*’),它会拆分为”‘贰次性使用吸痰管’:*
& ‘一次性’:* & ‘使用’:* &
‘吸痰管’:*”,并且鉴于空格的设想,大家用的是plainto_tsquery,而它是不认识:*的。

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://10.1.2.108:9000/hbase</value>
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
</configuration>

当用户输入壹些字符的时候,如何判断是已到位的主要性词(进行重大词联想)如故未输完的最首要词(自动补完),那是个难点。我们可以将用户常搜的部分人命关天词缓存起来(大概定期从tsv字段获取),当用户输入相配到多个(>一)缓存关键词时,表明关键词还未输全部,重返关键词列表供用户挑选,不然(相称数量<=一)时,则去询问关联关键词。同样用redis(很幸运,redis2.八版本后支持set集合的值正则万分):

留神这里的hbase.rootdir设置为hdfs的蕴藏路线前提是hadoop平台是伪分布式,唯有二个NameNode

/// <summary>
/// 获取关键词(模糊匹配)
/// </summary>
public static List<string> GetKeywords(string keyword, int takeSize = 10)
{
    IDatabase db = RedisGlobal.MANAGER.GetDatabase();
    //这里的pageSize表示单次遍历数量,而不是说最终返回数量
    var result = db.SetScan(RedisKeyTemplates.SearchKeyword, keyword + "*", pageSize: Int32.MaxValue);
    return result.Take(takeSize).Select<RedisValue, string>(r => r).ToList();
}

  3、启动Hbase

本来,也有十分大希望用户输入已经拾分到二个完好无损关键词,但还要该重大词是其它一些首要词的1有的。大家得以先去缓存里面取关键词,若数量有限12个(页面上提示至多13个),那么就再去看是还是不是有涉及关键词补充。

[hadoop@master hbase]$ start-hbase.sh 
localhost: starting zookeeper, logging to /usr/local/hadoop/hbase/bin/../logs/hbase-hadoop-zookeeper-master.out
master running as process 3933. Stop it first.
starting regionserver, logging to /usr/local/hadoop/hbase/bin/../logs/hbase-hadoop-1-regionserver-master.out

大部网址搜索还支持拼音搜索,即按全拼或拼音首字母搜索。

jps查看过程多了 HMaster和 HRegionServer

对主要词[组合]赋予权重,权重总结能够依照找出量、找出结果等,每一回回去给用户最得力的前几条。那事后再说吧。

[hadoop@master hbase]$ jps
7312 Jps
12178 ResourceManager
11540 NameNode
11943 SecondaryNameNode
12312 NodeManager
11707 DataNode
3933 HMaster
7151 HRegionServer

看来,数据库自带的全文字笔迹查验索依旧建立在字段检索的功底上,适合古板SQL查询现象,而且围绕分词系统的查询方案和逻辑半数以上亟待团结处理,涉及到稍复杂的采纳就不可能,大概效能低下了(比如上述的自动补完功效),其余分布布局的时候也要在上层另做集群框架结构。

  4、使用Hbase Shell


[hadoop@master hbase]$ hbase shell
2016-11-07 10:35:05,262 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/hbase/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.3, rbd63744624a26dc3350137b564fe746df7a721a4, Mon Aug 29 15:13:42 PDT 2016

Elasticsearch

1) 查看集群状态和版本音讯

基于5.4版本

hbase(main):001:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 1.0000 average load

hbase(main):002:0> version
1.2.3, rbd63744624a26dc3350137b564fe746df7a721a4, Mon Aug 29 15:13:42 PDT 2016

节点:一个运维中的 Elasticsearch 实例称为3个 节点。

二) 创设user表和多个列族

集群是由3个要么八个有着同样 cluster.name 配置的节点组成,
它们一齐负责数据和负载的压力。当有节点参预集群中要么从集群中移除节点时,集群将会重复平均分布全体的数量。1个集群只好有八个主节点。

hbase(main):003:0> create 'user','user_id','address','info'
0 row(s) in 2.3570 seconds

=> Hbase::Table - user

目录:作为名词时,类似于守旧关系型数据库中的贰个数据库。索引实际上是指向一个依旧四个物理
分片逻辑命名空间
。四个索引应该是(非强制)因一齐的性状被分组到壹块的文书档案集合,
例如,你恐怕存款和储蓄全体的产品在索引 products
中,而存储全数发卖的交易到索引 sales 中。

3) 查看全体表

分片:一个分片是一个Lucene 的实例(亦即多个 Lucene 索引 ),它仅保留了任何数据中的一有的。索引内随意一个文书档案都归属于3个主分片,所以主分片的数量决定着索引能够保留的最大数据量;别本分片作为硬件故障时保卫安全数量不丢掉的冗余备份,并为寻找和重返文书档案等读操作提供服务。

hbase(main):005:0> create 'tmp', 't1', 't2'
0 row(s) in 1.2320 seconds

=> Hbase::Table - tmp

hbase(main):006:0> list
TABLE                                                                                                                                                                                        
tmp                                                                                                                                                                                          
user                                                                                                                                                                                         
2 row(s) in 0.0100 seconds

=> ["tmp", "user"]
hbase(main):007:0> 

项目:由项目名和mapping组成,mapping类似于数据表的schema,或许说类[以及字段的切切实实]定义。

肆) 查看表结构

手艺上讲,七个体系能够在一样的目录中存在,只要它们的字段不争辩,即同名字段类型必须一律。然则,若是四个类别的字段集是互不一致样的,那就象征索引大校有5/10的数额是空的(字段将是
稀疏的
),最后将促成品质难题
。——导致那一限量的根本原因,是Lucene未有文书档案类型的概念,四个Lucene索引(ES里的分片)以扁平的格局定义个中有着字段,即借使该分片里有多少个类型A\B,A中定义了a\c八个字符串类型的字段,B定义了b\c五个字符串类型的字段,那么Lucene创立的酷炫包罗的是a\b\c七个字符串类型的字段,要是A\B中c字段类型差别等,那么配置那一个映射时,将会出现分外。由此亦知,多少个分片可含蓄不相同品种的文书档案。

hbase(main):008:0> describe 'user'
Table user is ENABLED                                                                                                                                                                        
user                                                                                                                                                                                         
COLUMN FAMILIES DESCRIPTION                                                                                                                                                                  
{NAME => 'address', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_V
ERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                                                                        
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERS
IONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                                                                           
{NAME => 'user_id', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_V
ERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                                                                        
3 row(s) in 0.2060 seconds

hbase(main):009:0> 

文书档案:2个对象被连串化成为 JSON,它被喻为一个 JSON 文档,钦点了唯壹 ID 。

5) 删除表

借使文书档案中新添了二个未事先定义的字段,恐怕给字段传递了非定义类型的值,那么就涉及到动态映射的定义了。其它,就算能够追加新的门类到目录中,恐怕扩张新的字段到花色中,不过无法增添新的分析器恐怕对现成的字段做更改,遭受那种情景,我们兴许必要针对此类文书档案重建索引。

hbase(main):010:0> disable 'tmp'
0 row(s) in 2.2580 seconds

hbase(main):011:0> drop 'tmp'
0 row(s) in 1.2560 seconds

hbase(main):012:0> 

在 Elasticsearch 中, 种种字段的有着数据 都是 暗中认可被索引的
即每一个字段都有为了火速找寻设置的专用倒排索引。

  5、停止Hbase

开朗并发调节,Elasticsearch 使用
version 版本号调控、处理争论。

[hadoop@master hbase]$ stop-hbase.sh 
stopping hbase......................
localhost: no zookeeper to stop because no pid file /tmp/hbase-hadoop-zookeeper.pid

Lucene中的[倒排]目录(在Lucene索引中显现为 段
的定义,但Lucene索引除表示具备 的成团外,还有三个 提交点
的概念
),[假设创设]是不可变的,那有过多便宜:

停下Hadoop的逐条是终止hbase、结束YACR-VN、甘休Hdfs

  • 不须求锁;
  • 重用索引缓存[,而非每一遍去磁盘获取索引](即缓存不会失灵,因为索引不改变),进一步能够引用同样查询[创设进度和重临的数码],而不须要每一回都再也查询;
  • 允许[索引被]压缩;

  6、web使用

可是 数据/文书档案 变化后,终归依旧得更新 索引/段 的,那么怎么创新呢?——
新的文书档案和段会被创设,而旧的文档和段被标识为除去状态,查询时,后者会被放弃。

可通过Hdfs页面 http://10.1.2.108:50070进入Hbase页面

安装Elasticsearch前须要安装JRE(Java运营时,注意和JDK的分别),然后去到https://www.elastic.co/start里,根据提示步骤安装运行即可。(笔者为windows环境)

抑或直接待上访问 http://10.1.2.108:60010/master.jsp

设置完以往大家就能够在通过http://localhost:5601打开kibana的工作台。为了让远程机子可以访问,在启动kibana之前要先设置kibana.yml中的server.host,改为安装了kibana的机器的IP地址,即server.host:
“192.168.0.119”,注意个中冒号和引号之间要有空格,不然无效,小编被那里坑成狗,也是醉了。同理,要elasticsearch远程可访问,供给设置elasticsearch.yml中的network.host。

 

单机上运行四个节点,文书档案中说
“你能够在同一个索引内,完全根据运维第二个节点的情势来运营3个新节点。三个节点能够共享同3个索引。”
没搞懂什么意思,试了下再开个调整台进入es目录实行命令行,会抛十分。所以照旧安安分分依照网上其余材质提到的,拷贝一份es目录先,要多少个节点就拷贝几份。。

原创作品,转发请备注原版的书文地址 http://www.cnblogs.com/lxmhhy/p/6026047.html

ES官方给.Net平台提供了四个工具——
Elasticsearch.Net 和
NEST,前者较底层,后者基于前者基础上进展了越来越尖端的包装以利于开采调用。

知识调换研商请加qq群:1802144肆一。多谢同盟

NEST有个Connection
pools,那跟大家平时认为的连接池不是同二个概念,而是一种政策——以什么艺术连接到ES——有各类政策:

  • SingleNodeConnectionPool:每便两次三番指向到同三个节点(一般设置为主节点,专责路由)
  • StaticConnectionPool:假使精晓某个节点Uri的话,那么每一回就[随机]接连到那些节点[中的三个]
  • SniffingConnectionPool:derived from StaticConnectionPool,a
    sniffing connection pool allows itself to be reseeded at run
    time。但是临时并不知道具体用处。。。
  • StickyConnectionPool:采取首个节点作为请求主节点。同样不知用那些有何样好处。。。

上边我们选用ES实现机关补完的功效,顺带介绍涉及到的知识点。

服务器依照用户日前输入再次来到也许的[用户真正想输的]字符串——”Suggest As
You Type”。ES提供了多个Suggester API(可参看 Elasticsearch
Suggester详解
,那篇文章未有介绍第七个Context
Suggester,笔者会在本节背后稍作描述),本文举例的自发性补完,适合利用Completion
Suggester(前边会谈到使用上设格外)。

大家先来看类型定义:

 1 public class ProductIndexES
 2 {
 3     public long Id { get; set; }
 4     public string ProductName { get; set; }
 5     /// <summary>
 6     /// 品牌标识
 7     /// </summary>
 8     public long BrandId { get; set; }
 9     public string BrandName { get; set; }
10     /// <summary>
11     /// 店铺标识
12     /// </summary>
13     public long ShopId { get; set; }
14     public string ShopName { get; set; }
15     /// <summary>
16     /// 价格
17     /// </summary>
18     public decimal Price { get; set; }
19     /// <summary>
20     /// 上架时间
21     /// </summary>
22     public DateTime AddDate { get; set; }
23     /// <summary>
24     /// 售出数量
25     /// </summary>
26     public long SaleCount { get; set; }
27     //产品自定义属性
28     public object AttrValues { get; set; }
29     public Nest.CompletionField Suggestions { get; set; }
30 }

若要使用Completion
Suggester,类型中须求有四个CompletionField的字段,可以将本来字段改成CompletionField类型,比如ProductName,我们同样能够针对CompletionField设置Analyzer,所以不影响该字段原有的目录功用(CompletionField接受的是字符串数组Input字段,经测试也看不出Analyzer对它的成效(自动补完回到的字符串是Input数组中与用户输入初阶相称的字符串,对分词后的字符串没有反映),所以Analyzer配置项的功用是何许让人费解);或然此外加字段,用于专门存放Input数组,那就更是灵敏了,本例选拔的是后者。

创办索引:

 1 var descriptor = new CreateIndexDescriptor("products")
 2     .Mappings(ms => ms.Map<ProductIndexES>("product", m => m.AutoMap()
 3         .Properties(ps => ps
 4         //string域index属性默认是 analyzed 。如果我们想映射这个字段为一个精确值,我们需要设置它为 not_analyzed或no或使用keyword
 5         .Text(p => p
 6         .Name(e => e.ProductName).Analyzer("ik_max_word").SearchAnalyzer("ik_max_word")
 7         .Fields(f => f.Keyword(k => k.Name("keyword"))))//此处作为演示
 8         .Keyword(p => p.Name(e => e.BrandName))
 9         .Keyword(p => p.Name(e => e.ShopName))
10         .Completion(p => p.Name(e => e.Suggestions)))));//此处可以设置Analyzer,但是看不出作用
11 
12 Client.CreateIndex(descriptor);

第6、七行表示ProductName有多种配置,作为Text,它能够视作全文字笔迹核查索,当然大家期望用户在输入产品全名时也能规范相配到,所以又设置其为keyword表示是个第1词,这种情形正是Multi
fields
。可是出于我们设置了SearchAnalyzer,和Analyzer同样,用户输入会按一样方法分词后再去相配,所以无论是真名输入只怕局地输入,都足以透过全文检索到。

跟着把目的写入索引,方法如下:

 1 public void IndexProduct(ProductIndexES pi)
 2 {
 3     var suggestions = new List<string>() { pi.BrandName, pi.ShopName, pi.ProductName };
 4     var ar = this.Analyze(pi.ProductName);//分词
 5     suggestions.AddRange(ar.Tokens.Select(t => t.Token));
 6     suggestions.RemoveAll(s => s.Length == 1);//移除单个字符(因为对自动补完来说没有意义)
 7     pi.Suggestions = new CompletionField { Input = suggestions.Distinct() };
 8 
 9     //products是索引,product是类型
10     Client.Index(pi, o => o.Index("products").Id(pi.Id).Type("product"));
11 }

假设作者新插入了多少个文书档案,几个suggestions里的input分别是[“产品”],[“产家合格”],[“产品测试”,”产品”,”测试”],鲜明,依据上述方法的逻辑,最终尤其数组中的后两项是首先项分词出来的结果。

接下去正是最终一步,通过用户输入重回相称的记录:

1 public void SuggestCompletion(string text)
2 {
3     var result = Client.Search<ProductIndexES>(d => d.Index("products").Type("product")
4     .Suggest(s => s.Completion("prd-comp-suggest", cs => cs.Field(p => p.Suggestions).Prefix(text).Size(8))));
5     Console.WriteLine(result.Suggest);
6 }

好,1切类似很圆满,那时候用户输入“产”那个字,我们希望的是回去[“产品”,”产家合格”,”产品测试”],次一点的话就再多多少个”产品”(因为有着input中有七个”产品”)。但是结果却出小编预期,笔者在kibana调控台里截图:

澳门美高梅手机网站 3

回来的是[“产品”,”产品”,”产家合格”]。查找资料发现这就如是ES团队特有为之——假设结果指向同二个文书档案(或然说_source的值同样),那么结果合并(保留个中1个)——所以Completion
Suggester并不是为着活动补完的情景设计的,它的效率重大依旧探究文书档案,文书档案找到就好,不管你的suggestions里是或不是还有别的与输入相配的input。那时聪明的同班只怕会说要不不回去_source试试看,很遗憾,官方说_source
meta-田野 must be
enabled,而且并未给您设置的地点。在此之前有版本mapping时有个布局项是payloads,设置成false貌似能够回来全数相称的input,还有output什么的,同理可得依然有艺术改动暗许行为的,但是作者试的那几个版本把那一个都去掉了,不知今后是还是不是会有改换。。。

Completion only retrieves one result when
multiple documents share same
output

那样看来,Suggester更像自定义标签(依据标签搜索文书档案,Completion
Suggester只是足以让我们只输入标签的一局地而已)。所以说自动补全的效率依然得其它达成咯?要么从此有生命力看下ES的源码看怎么修改吧。。

在Completion
Suggester基础上,ES其它提供了Context Suggester,有二种context:category

geo,在询问时带上context就能够得到与之相关的结果。意即在标签基础上再加1层过滤。

相关性:与之相应的要紧概念便是评分,首要用在全文字笔迹查验索时。Elasticsearch
的相似度算法 被定义为搜索词频率/反向文书档案频率, TF/IDF。私下认可意况下,重返结果是按相关性倒序排列的。

缓存:当进行精确值查找时,
大家会利用过滤器(filters)。过滤器很要紧,因为它们施行进度尤其快 ——
不会猜测相关度(直接跳过了上上下下评分阶段)而且很轻巧被缓存。壹般的话,在准确查找时,相关度是能够忽略的,排序的话大家更加多的是基于有些字段自定义排序,所感到了品质惦念,大家相应尽大概地选用过滤器。

数组:ES并不曾显式定义数组的概念,你能够在贰个string类型的字段赋值为”abc”,也足以赋值为[“abc”,”ddd”],ES会自动处理好。那在局部景色下很有用,比如产品属于有些叶子类目,它的类目Id设为该叶子类指标Id,那样用户能检索到此类目下的具有产品,但这么会有失水准:当用户寻觅父类目时将得不到别的产品。显著那是不创制的,所以我们得以将成品的类目Id赋值包涵从根类目到叶子类目标类目Id数组,用户寻觅其中任何类目都能得到该产品。 合法文书档案


Quartz.Net

在给内容建索引时能够实时建立,也能够异步[批量]创设,后者的话大家常用安插职责的不二等秘书籍,涉及到的工具比较宽泛的是Quartz.Net。

以下对Quartz.Net的描述基于二.伍版本。

Quartz.Net支持五个trigger触发同1个job,但不支持三个trigger触发四个job,不明其意。

Quartz.Net的job和trigger注解格局有多样,能够由此代码

IJobDetail job = JobBuilder.Create<IndexCreationJob>().Build();
ITrigger trigger = TriggerBuilder.Create().StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(600).RepeatForever()).Build();

_scheduler.ScheduleJob(job, trigger);

要么经过xml文件。倘诺通过xml文件,则要钦点是哪些xml文件,也足以安装xml文件的watch
interval,还足以设置线程数量等等(半数以上都有暗中认可值,可挑选安装),同样能够由此代码

XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper());
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler sched = factory.GetScheduler();
processor.ProcessFileAndScheduleJobs(IOHelper.GetMapPath("/quartz_jobs.xml"), sched);

上述代码即意味着读取根目录下的quartz.jobs.xml获取job和trigger的扬言。还有另壹种代码方式:

var properties = new NameValueCollection();
properties["quartz.plugin.jobInitializer.type"] = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin";
properties["quartz.plugin.jobInitializer.fileNames"] = "~/quartz_jobs.xml";
properties["quartz.plugin.jobInitializer.failOnFileNotFound"] = "true";
properties["quartz.plugin.jobInitializer.scanInterval"] = "600";

ISchedulerFactory sf = new StdSchedulerFactory(properties);
_scheduler = sf.GetScheduler();

以上600表示makes it watch for changes every ten minutes (600 seconds)

当然大家能够通过安插文件(同评释job和trigger的xml文件,两者指标差别),如:

  <configSections>
    <section name="quartz" type="System.Configuration.NameValueSectionHandler"/>
  </configSections>
  <quartz>
    <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
    <add key="quartz.threadPool.threadCount" value="10"/>
    <add key="quartz.threadPool.threadPriority" value="2"/>
    <add key="quartz.jobStore.misfireThreshold" value="60000"/>
    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
    <!--*********************Plugin配置**********************-->
    <add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
    <add key="quartz.plugin.xml.fileNames" value="~/quartz_jobs.xml"/>
  </quartz>

只怕独立几个文书quartz.config:

# You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedence

quartz.scheduler.instanceName = QuartzTest

# configure thread pool info
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
quartz.threadPool.threadCount = 10
quartz.threadPool.threadPriority = Normal

# job initialization plugin handles our xml reading, without it defaults are used
quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz
quartz.plugin.xml.fileNames = ~/quartz_jobs.xml

# export this server to remoting context
#quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz
#quartz.scheduler.exporter.port = 555
#quartz.scheduler.exporter.bindName = QuartzScheduler
#quartz.scheduler.exporter.channelType = tcp
#quartz.scheduler.exporter.channelName = httpQuartz

不必要专门钦定是身处配置节中,还是quartz.config中,或许两者皆有,Quartz.Net会活动加载配置项。代码和安顿格局也足以混着使用,由此可知给人的挑三拣四多而杂,加之官方文书档案并不完美,初次接触轻巧令人困惑。

 

参考资料:

Elasticsearch:
权威指南

HBuilder处理git冲突,同 10_Eclipse中示范Git争持的缓解

PostgreSQL的全文检索插件zhparser的普通话分词效果

SCWS 华语分词

聊1聊双10一偷偷的技术 –
分词和寻觅

详见讲授PostgreSQL中的全文字笔迹核查索的用法

Lucene 三.0
原理与代码分析

 

 

转载请声明出处:http://www.cnblogs.com/newton/p/6873508.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注