您的位置:首页 > 其它

Elasticsearch服务器 更好的搜索笔记

2016-01-11 23:16 190 查看

5.1 lucene评分简介

简介lucene的评分体系tf/itf

5.1.1当文档被匹配时

介绍lucene中文档被匹配的一些因素

5.1.2默认评分公式

介绍lucene打分的公式

5.1.3相关性的意义

lucene的打分机制不是万能的,需要根据自己的需求去具体的打分,排序



5.2 elasticsearch的脚本功能

脚本的相关属性script包含实际的脚本代码;lang定义了提供脚本语言信息的字段,默认为mvel,params此对象包含参数及其值

5.2.1 脚本执行过程中可用的对象

不同的阶段使用的对象是不同的,如在搜索阶段对象是_doc,_source等;一个字段可以作为_source文档的一部分存储;一个存储未经解析的

值;一个解析成若干标记的值

5.2.2 MVEL

如果没有明确说明默认使用

5.2.3使用其他语言

也可以使用js,python等,但是必须安装插件

5.2.4 使用自定义脚本库

脚本应该放在config/scripts目录中,并且声明名字,在dsl中使用

如果不喜欢脚本,允许使用java类

1、工厂实现类

必须实现org.elasticsearch.script.NativeScriptFactory类,该类强制实现newScript()方法

2、实现本地脚本

可以实现脚本来截取特定的字段,进行处理,例如在此处对一个field里面的字段进行hascode,并且排序,相当于实现了一个ES所定义的接

口,用自己的程序,这块应该可以做展示方面的工作?感觉可以用得到

3、安装脚本

将写的脚本封装成JAR归档,放在lib目录下,并且在elasticsearch.yml配置文件添加一行

4、执行脚本

发送dsl语言查询,如果顺利就可以看到按照我们所规定的逻辑排序的展示

5.3 搜索不同语言的内容

关于多语言数据的处理方法

5.3.1 区分处理不同语言

要选择合适的算法来处理语言,针对不同的语言,所使用的处理不一样,例如空白分词器等

5.3.2多语言处理

大约有三种方法:不同语言存储成不同的类型

不同语言的文档存储到单独的索引中

对单一文档字段存储成多个版本,每个版本包含不同的语言

重点在不同的语言存储在单个索引中的方式

5.3.3 检测文档的语言

可以使用apache tika以及java的language detection来进行检测

5.3.4 示例文档

给出一个文档例子,有title,content,lang等字段,可用lang字段选择对应的分词器

5.3.5 映射文件

对于上述的文档给出一个mapping,如果知道指定的语言时候,进行用lang指定的分析器,如果不知道的话,用default默认的simple分词器

,这个小结可以学习如何给定两个分词器,一个是默认的,一个是根据规定语言所动态指定的分词器,可能有用

5.3.6 查询

1、用已知语言查询,例如documents为复数,用英语的话,会自动变为单数来查询,因为english分词器可以识别

2、使用默认的时候,无法区分是复数,返回无结果

3、使用组合查询,使用两个都有,如果已知语言,以及不知道语言都给出结果,组合查询

5.4 使用查询加权影响得分

使我们更重要的字段排序更靠前

5.4.1 加权

加权可以在两部分,一部分是query一部分是field,总共这两部分

5.4.2 为查询添加加权

对于一个query查询,可以在语言里指定哪一个字段有更重的权重,即哪一个fields更重要,分别是

5.4.3 修改得分

1、constant_score查询

允许对任何过滤器或者查询明确设置一个被用作得分的值

2、加权查询

允许定义一个查询额外部分,降低匹配,给出例子,查询的时候remarque的书得分降低10倍

3、function_score查询

比之前的复杂,在得分计算成本高昂时有用,因为它将计算过滤后文档的得分

查询结构里有query,fielter,function,boost_mode,score_mode,max_boost,boost等参数

背后的逻辑是,函数匹配文档,并基于score_mode参数计算得分,然后文档查询得分由函数计算所得分数结合而成,结合时基于boost_mode

boost_mode:允许定义如何将函数查询计算分数与查询分数结合

score_mode:定义函数计算分数是如何结合到一起的

boost_factor函数:允许把文档分数乘以一个给定的值

script_score函数:允许使用脚本来计算得分

random_score函数:通过seed值生成一个为随机分数

decay函数:之前的函数随着距离变大而贬低,该函数不同,距离基于一个单值的数值型字段

假设一个point字段,存储位置信息,希望得分收到用户所在位置的距离影响如为(52,21)原点,当每大于1km那么得分衰减10%,这个例子

对于距离的时候有可能能用到

4、弃用查询

之前用的一些查询,但是新版本已经不用的一些查询有custom_boost_factor查询,custom_score查询,custom_filters_score查询,都可以

用function_score查询来表达代替

5.5 索引是加权何时有意义

获得独立查询的加权,重建索引需要,加权值变化时,也要重建索引,如果把omit_norms设置为true时,就不能使用索引时加权

5.5.1 输入数据中定义字段加权

给出输入数据时如何进行加权,对应字段需要有加权值,此处并不是在mapping的时候定义的加权值

5.5.2 在映射时候定义加权

在映射的时候给出每个字段的boost值,对于搜索这个可能更有用,毕竟用户本身不知道哪一个字段是更加的重要的

5.6 同义词

就是使用同义词,使搜索的时候可以搜出来

5.6.1 同义词过滤器

给出一个具体的同义词过滤器的dsl结构,给出完整的构造,并且有同义词映射;如果不想要写在dsl中,也可以使用文件,从文件得出同义词映射

5.6.2 定义同义词规则

如何定义那些是同义词的

1、使用solr同义词

显示同义词,即类似was,star wars=>starwars

等效同义词,was,star wars,starwars这四个是等效的

扩展同义词,one,two,three=>one,two,three

5.7 理解解释信息

查看为什么有的排前,有的排在后面,即看懂explain解析信息

5.7.1 理解字段分析

看懂如何查看一个query如何被分词的,有具体的curl语句,可以查看

5.7.2 解释查询

解释一个文档是如何被打分的,每一部分的分是多少,即explain信息

本章节主要介绍如何使搜索结果更加的复合我们想要的结果,比如排序等方面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: