vertica从其他表迁移数据到新表(insert into 语句用法实例)

前面一篇开始学习solr的时候,做了个入门的示例http://blog.csdn.net/zjc/article/details/24414271 。虽然可以检索出内容,但总和想象的结果有差异——比如,检索“天龙”两个字,按常规理解,就应该只出来《天龙八部》才对,可是竟然也会把《倚天屠龙记》检出来。后来研究了一下,发现系统是这样处理的:无论是抽索引时还是分析检索词时,都把所有文字按单字拆开。这样,刚好《倚天屠龙记》里包含“天”和“龙”。于是对照solr的配置文件schema.xml做了一些分析和验证。下面来看一下:

在schema.xml里,对检索结果有最直接影响的有这么几项:

<solrQueryParserdefaultOperator="OR"/>

这一行在文件较靠后的位置,但我最先拿出来说。这表示,对拆分后的检索词是按照“且”还是“或”的关系选定结果。默认是OR,可以改成AND。象前面例子,如果再有一本《天天向上》,也一样会被检索出来。因为包含了“天”字。那就差的更远了。所以如果采用这个默认的单字拆分法,那最好是用AND,否则结果就太乱了。

好了,假定我们改成了AND,那么结果是《天天向上》没有了,但《倚天屠龙记》还在的。因为既有“天”又有“龙”,说明单字拆分法有不足之处。

决定这个单字拆分法的是谁呢?仔细检查文件,我们发现这一行:

<field name="name"type=" text_general" indexed="true"stored="true"/>

表示name这个字段是text_general类型的。这就靠谱了,多半text_general类型的处理方式就是单字拆分。

有没有更好的分词方法呢,当然有,而且肯定不止一种。我按照网上的例子采用了mmseg4j。使用方法很简单,把解压后的几个jar文件放到classpath目录下。然后在schema.xml里增加下面几行:

<fieldType name="textComplex"class="solr.TextField" positionIncrementGap="100" >

<analyzer>

<tokenizerclass="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"mode="complex" dicPath="./dic"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldTypename="textMaxWord" class="solr.TextField"positionIncrementGap="100" >

<analyzer>

<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"mode="max-word" dicPath="./dic"/>

<filterclass="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="textSimple"class="solr.TextField" positionIncrementGap="100" >

<analyzer>

<tokenizerclass="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"mode="simple" dicPath="./dic"/>

<filterclass="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

这里定义了三种fieldType,分别是textComplex、textMaxWord、textSimple。名称无所谓,重要的是子元素定义了分词器和过滤器使用的类:com.chenlb.mmseg4j.solr.MMSegTokenizerFactory、solr.LowerCaseFilterFactory。其实三种用的类是相同的,只是后面有个mode不同。

这里只是定义了分词类型,我们要把这个分词类型应用到我们的数据里才行。所以,要把<field name="name" type="textSimple"indexed="true" stored="true"/> ——我这里改成了textSimple 。在fieldType和fieldname的共同作用下,我们终于可以完成中文习惯上的分词了。当然要重新运行代码,重新抽索引才行,而且字段name里得有东西(参考上一篇的代码)。

搜索“name:天龙”,结果为空。这又是怎么回事呢?难道又错了?其实如果想看分词效果,solr的管理端有个分析工具很好用。

进到分析页面,上面输入字段名称name,下面输入文本,看一下它倒底是怎么分的

原来textSimple方式把“天龙八部”作为一个整词了,难怪我们搜“天龙”没结果,再搜“天龙八部”,有结果了。晕,这也太不符合习惯了。少字没结果,多字反倒有结果。接着,我们再换一种试试:

<field name="name" type="textMaxWord"indexed="true" stored="true"/> name字段用textMaxWord类型,这表示采用最大化分词的方式。再来分析一下:

这回差不多了,“天龙八部”被分成“天龙”“八”“部”三个词。搜索这三个词都有结果了,而且是唯一结果。

换个搜索写法:

不写name:天龙,直接写天龙。晕死,倚天屠龙记又出来了。接着看schema.xml:

<defaultSearchField>text</defaultSearchField>

这表示默认搜索字段,如果前面什么都不写,就到text里去查找。而text怎么定义的呢?再找:

<field name="text" type="text_general"indexed="true" stored="false"multiValued="true"/>

果然,又回到text_general来了,还是单字拆分法。

等等,回忆一下,我们并没有text这个字段啊(参考上一篇代码),我们只录入了三个字段id、name、price,这个text是谁?继续找,在这里——

<copyField source="cat"dest="text"/>

<copyField source="name"dest="text"/>

<copyField source="manu"dest="text"/>

<copyField source="features"dest="text"/>

<copyField source="includes"dest="text"/>

这几行表示,把cat、name、manu、features、includes都作为text看待(一般是为提供通用检索或简单检索功能用的),text是text_general类型的,还是默认的。所以不写条件时当然又回到单字查找法了。

总结一下:

这5个元素交互作用,最终共同影响着搜索结果。

fieldType:定义了可选的类型,当然定义了未必就用

field:定义了某个字段具体是什么fieldType的

copyField:提供了一个同时查找多个字段的简便方法

defaultSearchField:定义了不写字段条件时的查找范围

solrQueryParser defaultOperator:定义了各分词之间采用什么逻辑组合

vertica从其他表迁移数据到新表(insert into 语句用法实例),布布扣,bubuko.com

时间: 2024-10-11 18:16:06

vertica从其他表迁移数据到新表(insert into 语句用法实例)的相关文章

mysql旧表去重数据导入新表且赋予主键id新值

业务需求: A表有id,n1,n2,n3字段,为新建空表, B表有id,n1,n2,n3,n4,n5等字段,为含有数据的旧表, 现将B表中的n1,n2,n3组合的记录去重后导入A表中,并且A表主键也要录入值 方案:将B表的记录查询后去重,同时对查记录结果编排序号,将序号作为待插入A表的id值,sql语句如下: INSERT INTO A表(id,n1,n2,n3) select @row :[email protected]row+1 AS id,t1.* from ( SELECT DISTI

更新一张表的数据到新表

update mb_tariff a inner join mb_tariff_temp b  set a.payment =  b.payment where a.mybus_id = b.mybus_id

SQL Server复制表结构和表数据生成新表的语句

参考:http://topic.csdn.net/t/20020621/09/820025.html SELECT   *   INTO   newTableName   FROM   oldTableName 此方法将把旧表的结构和数据同时copy生成新表,不过主键外键约束没有生成,需要手动设置.

elasticsearch迁移数据到新索引中

因为业务原因,需要修改索引的映射的某个字段的类型,比如更改Text为Keyword. 需要如下步骤: 1).先新建索引,映射最新的映射实体 2).迁移老索引的数据到新索引中(数据较大的话,可以分批迁移) 3).删除老索引 下面使用elasticsearch-head插件(安装自行网上搜索)操作 启动elasticsearch和elasticsearch-head,如下图:      1.创建新索引,新索引名为:myindex 2.迁移老索引的数据到新索引中 3.删除老索引即可 注:我net用的客

表T2数据如何Update表T1中数据

如何用一张表中的数据Update另外一张表的数据. UPDATE T1 SET (C1, C2, C3) = (SELECT C1, C2, C3 FROM T2 WHERE T2.USER_ID = T1.USER_ID) WHERE EXISTS (SELECT * FROM T2 WHERE T2.USER_ID = T1.USER_ID); 如果没有"Where Exists"部分,则可能会出现的问题:在表T1中有的行,但如果在表T2中没有对应的行,那么值会被更新为NULL.加

MySQL数据库表的数据插入、修改、删除操作及实例应用

1.MySQL数据库表的数据插入.修改.删除操作SQL语法格式: 1 CREATE DATABASE db0504; 2 3 USE db0504; 4 5 CREATE TABLE student ( 6 sno VARCHAR (10) NOT NULL UNIQUE PRIMARY KEY, 7 sname VARCHAR (20) NOT NULL, 8 ssex enum ('男', '女') NOT NULL DEFAULT '男', 9 sbirth date, 10 sclass

使用elasticdump迁移数据到新es集群

参考文档 https://blog.csdn.net/u012731379/article/details/79856113 https://blog.csdn.net/u010466329/article/details/79209236 https://blog.csdn.net/laoyang360/article/details/65449407 迁移方法 通过logstash的input和output配置迁移(配置灵活适用于长期数据同步等) 通过迁移工具如elasticdump等(适用

mysql 复制表结构 / 从结果中导入数据到新表

这只会复制结构: mysql> create table a like mysql1; Query OK, 0 rows affected (0.03 sec) mysql> desc a; +----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+----

oracle 根据一个表生成另一个新表和一个现有表给一个新的表赋值

1,添加表B ,和A表表结构相同(带数据) create table B  as select * from A; 2,添加表B ,和A表表结构相同(不带带数据) create table B  as select * from A where 1=2; 3,存在一个表B和表A的表结构一致,将A中的数据复制给B表 insert into B select * from A; 4,存在一个表B和表A的表结构不一致,将A中的数据复制给B表 insert into B (x1,x2,x3...) se