YDB进阶使用详解

本文详细介绍了YDB的进阶使用,包括如何使用Lucene原生查询语法,自定义拓展分词类型,IK词库分词,动态列和动态字段的配置与应用,以及数据导入YDB的各种方法。同时讲解了如何通过帆软FineReport生成基于YDB数据的报表,以及实时消息接入自定义Reader与Parser的实现。文章还提供了丰富的示例代码和配置说明,帮助读者深入理解YDB的高级功能。
摘要由CSDN通过智能技术生成
 

第十章YDB进阶使用详解

一、Lucene原生查询语法的使用

       YDB的索引本质上是Lucene索引,如果之前有使用Solr Cloud、ElasticSearch的朋友肯定对Lucene不陌生,对于Lucene有自己的强大的过滤筛选方式,YDB里面依然兼容这种语法方式。

1.使用ydb_raw_query_s like 进行Lucene语法匹配

示例:

ydb_raw_query_s like 'cardnum:9612880118617710'

 

使用临近搜索的示例

ydb_raw_query_s like 'content:"建设银行"~0'

 

2.使用ydb_code_query_s like 进行Lucene语法匹配

ydb_raw_query_s与ydb_code_query_s的区别是ydb_code_query_s里的值要进行urlencode编码

 

如:

ydb_code_query_s like 'content%3A%22%E5%BB%BA%E8%AE%BE%E9%93%B6%E8%A1%8C%22%7E0'

 

 

二、自定义拓展分词类型

       默认YDB提供了一些分词的数据类型,可以满足大部分的匹配场景,但是如果因为业务的特殊,我们需要自己对Lucene分词进行拓展,YDB也提供了拓展自定义分词的方式。具体使用方法跟Solr的schema.xml非常类似。

 

1.首先 编辑lib下的fieldType.txt文件,增加新的分词类型


2.然后将相关依赖的jar包放到ydb的lib目录下,并重启YDB

3.建表示例

create table myntest(

c1 ft_yanniantest_y,

c2 ft_yanniantest_yy,

c3 ft_yanniantest_yyy,

c4 ft_yanniantest_yn,

c5 ft_yanniantest_yny,

c6 ft_yanniantest_yyyyyyy,

c7 ft_yanniantest_ynynyny

)

对应关系如下


三、IK词库分词

       YDB内置了第三方的IK词库分词,IK分词的介绍如下

1.IKAnalyzer 简介

       IKAnalyzer 是一个开源基于 JAVA 语言的轻量级的中文分词第三方工具包,从 2006 年推出已经经历了三个较为完整的版本,目前最新版本为3.2.8,它基于Lucene 为应用主体,但是也支持脱离 Lucene,成为一个独立的面向JAVA 的分词工具。

2.IKAnalyzer 特性

a. 算法采用“正向迭代最细粒度切分算法”, 支持细粒度和最大词长两种分词方式,速度最大支持 80W 字/秒(1600KB/秒) 。

b. 支持多子处理器分析模式:中文、数字、字母,并兼容日文、韩文。

c. 较小的内存占用,优化词库占有空间,用户可自定义扩展词库。 采用歧义分析算法优化查询关键字的搜索排列组

d. 扩展 Lucene 的扩展实现,

3.YDB内的IK数据类型

textikikyy 存储,并且采用IK进行分词

ikyn,只进行IK分词,但不进行存储

4.IK分词的词库,怎样拓展

IK词库文件位于lib目录下的IK_ext.dic

大家修改后,记得重启YDB,以便让词库生效。

四、动态列,动态字段

       跟Solr 一样,正常情况下,需要事先把知道的字段定义在创建表中创建好,但是有的时候某个表的字段会不确定,并没同一个表的不同行之间有可能使用的字段也会不同,这时可以使用动态字段。

       这是一段动态字段的配置示例:

<dynamicField name="*_s" type="string" indexed="true" stored="false" docValues="true" omitNorms="true" omitTermFreqAndPositions="true" />

       这样,送过来的索引数据中,如果有以 _s 结尾的字段的值都都会被按照上述的索引方式进行索引,如字段名称为title_s,content_s。

       在匹配过程,如果动态字段和静态字段都符合,会优先匹配静态字段。另外动态字段的仅支持 * 这一通配符,这个通配符仅能位于开头或结尾。

       动态字段(Dynamic fields)允许 YDB 索引没有在 create table 中明确定义的字段。这个在忘记定义一些字段时很有用。动态字段可以让系统更灵活,通用性更强。

       动态字段和成规字段类似,除了它名字中包含一个通配符外,在索引文档时,一个字段如果在常规字段中没有匹配时,将到动态字段中匹配。

       假设schema中定义了一个叫*_i的动态动态字段,如果要索引一个叫 cost_i 的字段,但是 schema 中不存在 cost_i 的字段,这样 cost_i  将被索引到 *_i 字段中。

动态字段也是定义在 schema.xml 文件中,和其他字段一样,它也有个名词,字段类型,和属性。

 

5.动态字段的配置解析

<dynamicField name="*_s" type="string" indexed="true" stored="false" docValues="true" omitNorms="true" omitTermFreqAndPositions="true" />

1)name="*_s"  匹配规则

2)type="string" 该动态字段 匹配的Solr的fieldType(记住,并不是YDB的数据类型,后面我们会列出默认YDB内部支持的Solr的fieldType,当然也可以通过《自定义拓展分词类型》对于分词的类型进行自定义拓展)

3)indexed="true" 是否启用索引,如果启用该字段可以用于where中的检索

4)stored="false" 其否启用行存储,一般除了分词的类型使用按行存储外,其他的类型均建议按列存储

5)docValues="true"其否启用列存储,一般除了分词的类型使用按行存储外,其他的类型均建议按列存储

6)omitNorms="true" 是否对字段的长度进行规范化,一般我们用不上,建议配置为true直接忽略

7)omitTermFreqAndPositions="true" 对于保存了位置的分词类型,通过这个参数可以配置该字段是否需要保存词频和位置,一般我们都设置为true,不启用。

 

6.YDB内部支持的solr的fieldType

1)string类型

    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" omitTermFreqAndPositions="true" />

2)int类型

    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />

3)float类型

    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />

4)long类型

    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />

5)double类型

<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />

6)tint类型

    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true"  />

7)tfloat类型

    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"  omitNorms="true" omitTermFreqAndPositions="true" />

8)tlong类型

    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />

9)tdouble类型

    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0" omitNorms="true" omitTermFreqAndPositions="true" />

10)多值列的string类型

    <fieldType name="mstring" class="solr.StrField" sortMissingLast="true" omitNorms="true" omitTermFreqAndPositions="true" multiValued="true" />

11)多值列的int类型

    <fieldType name="mint" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />

12)多值列的float类型

    <fieldType name="mfloat" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />

13)多值列的long类型

    <fieldType name="mlong" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />

14)多值列的double类型

    <fieldType name="mdouble" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />

15)多值列的tint类型

    <fieldType name="mtint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true"  />

16)多值列的tfloat类型

    <fieldType name="mtfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0" multiValued="true"  omitNorms="true" omitTermFreqAndPositions="true" />

17)多值列的tlong类型

    <fieldType name="mtlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />

18)多值列的tdouble类型

    <fieldType name="mtdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />

19)geopoint用于地理位置存储的类型

    <fieldType name="geopoint" class="solr.TrieLongField" precisionStep="9" positionIncrementGap="0" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />

20)采用cjk二元分词的分词类型

       <fieldType name="textcjk" class="solr.TextField" positionIncrementGap="100"  omitNorms="true" omitTermFreqAndPositions="true" >

      <analyzer type="index">

        <tokenizer class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>

        <filter class="org.apache.lucene.analysis.cjk.CJKWidthFilterFactory"/>

        <filter class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>

        <filter class="org.apache.lucene.analysis.cjk.CJKBigramFilterFactory"    />

      </analyzer>

      <analyzer type="query">

        <tokenizer class="org.apache.lucene.analysis.standard.StandardTokenizerFactory"/>

        <filter class="org.apache.lucene.analysis.cjk.CJKWidthFilterFactory"/>

        <filter class="org.apache.lucene.analysis.core.LowerCaseFilterFactory"/>

        <filter class="org.apache.lucene.analysis.cjk.CJKBigramFilterFactory"    />

      </analyzer>

    </fieldType>

21)YDB内置的采用按照字符char方式分词的号码类型

      

       <fieldType name="haoma" class="solr.TextField"  omitNorms="true" omitTermFreqAndPositions="true" >

      <analyzer type="index">

        <tokenizer  class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" maxTokenLength="5" minTokenLength="3"  isforsearch="false"   />

      </analyzer>

      <analyzer type="query">

        <tokenizer  class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" maxTokenLength="5" minTokenLength="3"  isforsearch="true"   />

      </analyzer>

    </fieldType>

22)YDB内置的常规文本分词类型

       <fieldType name="simpletext" class="solr.TextField"  omitNorms="true" omitTermFreqAndPositions="true" >

      <analyzer type="index">

        <tokenizer  class="cn.net.ycloud.ydb.tokenizer.SimpleTextFactory" maxTokenLength="3" minTokenLength="1"  isforsearch="false"   />

      </analyzer>

      <analyzer type="query">

        <tokenizer  class="cn.net.ycloud.ydb.tokenizer.SimpleTextFactory" maxTokenLength="3" minTokenLength="1"  isforsearch="true"   />

      </analyzer>

    </fieldType>

23)       YDB内置的保存了词的存储位置信息的,按照字符char方式分词的号码类型

 

       <fieldType name="haomaposition" class="solr.TextField"  omitNorms="true" omitTermFreqAndPositions="false"  omitPositions="false">

      <analyzer type="index">

        <tokenizer  class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" maxTokenLength="5" minTokenLength="3"  isforsearch="false"   />

      </analyzer>

      <analyzer type="query">

        <tokenizer  class="cn.net.ycloud.ydb.tokenizer.ChepaiFactory" maxTokenLength="5" minTokenLength="3"  isforsearch="true"   />

      </analyzer>

    </fieldType>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值