可以使用INSTR函数来判断
select?distinct?A表ment,B表.keyword?from?A表,B表?where?INSTR(A表ment,B表.keyword)>0;
运行后有行返回,即表示A表中的comment中包含B表中keyword关键词。
如果删除上述语句中的去重复distinct关键字,运行速度会更快些
Elasticsearch中Text和Keyword类型的区别
关键词推荐(KeywordRecommendation简称KR):
关键词推荐是根据您的各种需要,向您推荐、助您选择关键词,从而更好地定位潜在客户的有力助手。
它就像是一个好用的渔网,帮您从茫茫词海中打捞出合适您的关键词。
点击导航中的“工具”,点击“关键词推荐”下的“立即使用”,即可开始使用关键词推荐工具。
您也可以在关键词/创意列表中的“添加关键词”窗口中点击“获得为您定制的热门关键词推荐”,或者在“搜索量过低”的关键词状态中,点击“关键词推荐工具”来进入关键词推荐工具。
在关键词推荐工具中,您可以:
1.输入某一产品/服务相关的关键词,点击“获取推荐关键词”,系统将提供与之相关的关键词
2.输入某个网页地址,点击“获取推荐关键词”,系统将自动根据网页中的内容,提炼热点关键词
对于关键词推荐结果,您可以:
1.修改选定地域
推荐结果是您为账户设置的推广地域量身定制的。例如,您的推广地域是北京、上海,系统将根据这两个城市的日均搜索量和竞争激烈程度为您推荐关键词。此时,某关键词的日均搜索量即最近七天内北京、上海两个城市的网民日均搜索次数之和。如有需要,您可以方便地点击推荐结果上方的链接,调整推荐结果所参照的地域
2.设置高级条件的查询
点击关键词输入框右侧的“高级查询”链接,您可以设置两个过滤条件:否定词和地域拓展词并查看“最高搜索量出现月份”数据,具体请参见如何使用关键词推荐工具的“高级查询”
3.按某一指标排序
点击“关键词”、“日均搜索量”、“竞争激烈程度”等指标,对关键词进行排序
4.下载选中的关键词
选择全部关键词(勾选“关键词”左侧的方框)或多个关键词,点击“下载关键词”链接来下载关键词列表
5.添加至现有的推广计划/推广单元
1)选择您希望添加的关键词,点击“添加”链接,或同时选择多个关键词,点击上方的“添加关键词”
2)为关键词选择匹配方式,将关键词保存到指定的推广计划和推广单元中即可
很多刚开始学习 Elasticsearch 的人经常会混淆Text 和Keyword数据类型。 它们之间的区别很简单,但非常关键。
它们之间的本质区别在于:对于 Text 类型,将文本存储到倒排索引之前,会使用分析器对其进行分析,而 Keyword 类型则不会分析。文档是否被分析过会影响其查询的结果。关于倒排索引和分析器的内容可以参考: jianshu/p/04d29098851a
如果将包含字符串的文档添加到 Elasticsearch,而之前没有定义字段的映射关系,那么 Elasticsearch 会自动创建一个包含 Text 和 Keyword 类型的动态映射。 即使它适用于动态映射,也建议在文档添加之前定义索引的映射关系,以节省空间并提高写入速度。
如:未定义mapping,直接添加文档内容,发现"message”的数据类型是 text ,“message.keyword"的数据类型是 keyword 。
返回mapping的结果
现在新建一个索引 text-vs-keyword ,并设置其mapping, keyword_field 字段设置为 keyword 类型, text_field 字段设置为 text 类型, text_and_keyword_mapping 为多字段类型,其本身为 text 类型,而 text_and_keyword_mapping.keyword 字段为 keyword 类型。
这两种字段类型在倒排索引中的存储方式不同,索引过程中的差异会影响Elasticsearch 进行查询的时间。
首先添加一条文档
添加后,索引中便会有一条文档
对于 keyword 类型,由于Elasticsearch不会使用分析器对其进行分析,所以你输入什么文本,索引就会按照原样进行保存。下图为文本在倒排索引中存储的样子。
对于 text 类型,Elasticsearch会先使用分析器对文本进行分析,再存储到倒排索引中。Elasticsearch默认使用标准分析器(standard analyzer),先对文本分词再转化为小写。关于标准分析器可以参考先前文章: jianshu/p/04d29098851a
标准分析器对文本进行分析后的结果
根据分析后的结果,下图为分词存储在倒排索引中的样子。
现在已经知道了 Text 和 Keyword 存储在倒排索引中的区别,接下来学习他们在查询中的区别。
查询分为两种查询
Match Query 和 Term Query 的区别与 Text 和 Keyword 的区别类似, Match Query 在查询时会对输入的关键词进行分析,而 Term Query 不会。
Elasticsearch 的查询原理是将查询的关键词与倒排索引中的词条进行匹配,查询的关键词与倒排索引中的词条必须完全相同视为匹配,否则不匹配。 这意味着在插入文档时是否进行分析和查询时是否进行分析将产生非常不同的结果。
不同的字段和不同的查询一共可以产生4种情况:以X代表不分析,O代表分析,左侧代表插入文档时是否分析,右侧代表查询时是否分析,则OX代表插入时分析,查询时不分析。
由于插入文档的 keyword 字段和 Term Query 查询时都不会进行分析,因此只有当文本完全匹配才会返回结果。
如果尝试文档中的一些词,由于不能与整篇文档相匹配,也不会返回结果。
这里有个疑问,查询关键词分析后的各个分词与倒排索引中的“The quick brown fox jumps over the lazy dog”不完全匹配,但为什么会产生结果呢?
这是因为我们在 Match Query 查询时使用的分析器不是标准分析器,Elasticsearch使用了关键词分析器(Keyword Analyzer),因此 Elasticsearch 在查询中没有任何改变。更多分析器可以参考: elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html
查看Keyword Analyzer分析后的结果,发现并没有对搜索关键词进行分词。
当选择标准分词器时进行 Match Query 查询时将不会得到任何结果。
text 字段在文档插入时会对文本进行分析,得到若干个分词。
尝试两条查询语句,一条查询关键词为完整的句子,另一条只有一个单词。
两条语句都返回空结果:
将查询单词转换为小写试下,由于查询关键字"the"与倒排索引中的"the"正好匹配,所以会返回该条记录。
text 字段和Match Query查询都会进行分析。
下面尝试两条查询语句
这两条查询语句都返回了结果:
以下情况推荐使用 keyword 类型:
掌握 text 和 keyword 数据类型的工作原理是学习Elasticsearch的内容之一,这两者的区别似乎很简单,但非常重要。如果需要两种数据类型,则可以在创建映射时使用多字段功能。
codecurated/blog/elasticsearch-text-vs-keyword/