• Elasticsearch--更好的搜索_加权得分,脚本,同义词


    Apache Lucene评分

    计算文档的评分属性时,考虑如下因素:

    • 文档加权:对文档建立索引时,对文档的加权值
    • 字段加权:查询和索引时,对字段的加权
    • 协调:基于文档条数的协调因子。对包含更多查询词条的文档,它提供更大的值
    • 逆文档频率:基于词条的因子,它告诉评分公式,给定词条出现的频率有多低。逆文档频率越高,词条越罕见
    • 长度规范:基于字段的规范化因子,它基于给定字段包含的词条数目。字段越长,该因子给的加权值越小。这基本意味着更短的文档更受分数的青睐
    • 词频:基于词条的因子, 描述给定词条在文档中出现的次数,词频越高,文档的得分越高。
    • 查询规范:基于查询的规范化因子,由每个查询词条比重的平方和计算而成。查询规范用于查询之间的得分比较。

    从上述讨论中得到:

    1. 匹配的词条越罕见,得分越高
    2. 文档字段越小,得分越高
    3. 字段加权越高,得分越高
    4. 文档匹配的查询词条数目越高,字段越少,分数越高

    Elasticsearch的脚本功能

    elasticsearch使用脚本执行的任何请求中,一些可能使用到的相似的属性:

    • script:包含实际执行的脚本
    • lang:脚本的语言信息
    • params:包含参数和值,每个定义的参数都可以在脚本中使用,由于缓存,使用参数的脚本比嵌入常数的代码执行更快

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

    • _doc: 它是org.elasticsearch.search.lookup.DocLookup对象的实例。通过它可以访问当前找到的文档,附带计算的得分和字段的值
    • _source:是org.elasticsearch.search.lookup.SourceLookup对象的实例,通过它可以访问当前文档的_source
    • _fields:是org.elasticsearch.search.lookup.FieldsLookup对象的实例,通过它可以访问文档的所有字段

    另一方面,在文档更新过程中,Elasticsearch只通过_source属性公开了ctx对象,通过它可以访问当前文档。

    当访问文档中的字段时,上述三种方式都可以,_doc可以更快的访问到分析的字段,_souce可以更快的访问字段的原始值。

    使用自定义的脚本库

    小脚本应该定义成文件,放在Elasticsearch的config/scripts目录中。使用方式如下:

    {
        "query":{
            "match_all":{
    
            }
        },
        "sort":{
            "_script":{
                "script":"sort_script",
                "type":"text",
                "order":"asc"
            }
        }
    }
    

    script属性值直接调用我们自定义脚本的名字。

    如果对脚本语言执行速度不满意,可以编写elasticsearch插件,插件应该放在lib目录下,并且使用Setting API或者在yml配置文件中注册

    搜索不同语言的内容

    思路:

    1. 使用语言检测库检测文档使用的语言,或者由用户将语言信息存放在文档的一个字段中
    2. 定义索引映射时,根据语言字段设置分析器
    {
        "mappings":{
            "indextype":{
                "_analyzer":{
                    "path":"lang"
                },
                "properties":{
                    "lang":{
                        "type":"keywords",
                        "index":"not_analyzed"
                    }
                }
            }
        }
    }
    

    lang字段的值是Elasticsearch知道的分析器的名字相同的值。

    使用加权影响得分

    加权

    加权适用于下列地方:

    • query:给定查询是复杂查询的一部分,且比其他部分更重要
    • field:重要字段的加权
    {
        "query":{
            "query_string":{
                "fields":[
                    "from^5",
                    "to^10",
                    "subject"
                ],
                "query":"john"
            }
        }
    }
    

    假定一个索引含有from,to,subject三个字段,现在搜索john,以上查询将生成3个小查询,最后组合结果,to字段权重最大,from字段次之。

    function_score查询

    {
        "query":{
            "function_score":{
                "query":{
    
                },
                "filter":{
    
                },
                "functions":[
                    {
                        "filter":{
    
                        },
                        "FUNCTION":{
    
                        }
                    }
                ],
                "boost_mode":"",
                "score_mode":"",
                "max_boost":"",
                "boost":""
            }
        }
    }
    

    一般来说,function_score查询中可以使用查询、过滤、函数和附加参数。每个函数可以有一个过滤器定义要应用的过滤结果。

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

    boost_mode定义如何将函数查询所计算分数与查询分数结合起来。取值如下

    1. multiply:默认行为,查询得分与函数得分相乘
    2. replace:查询的得分忽略,只用函数得分
    3. sum
    4. avg
    5. max
    6. min

    score_mode定义函数计算得分如何结合在一起,取值如下:

    1. multiply:默认
    2. sum
    3. avg
    4. first
    5. max
    6. min

    function节点中的可用函数如下:

    1. boost_factor函数:文档得分乘以一个给定值
    2. script_score函数:使用脚本计算得分,函数返回得分
    3. random_score:通过指定seed值生成一个伪随机分数,为了模拟随性,每次都应该指定一个新的seed
    4. decay函数:基于一个单值得数值型字段计算而来

    索引加权

    查询加权尽管很强大,但是如果在建立文档的时候就知道哪些字段重要,可以在索引时加权,这样效率也更高。

    索引加权既可以通过在插入数据的时候实现,也可以在定义映射的时候加权。

    同义词

    同义词过滤器

    过滤器的类型属性(type)设置为synonym,synonyms属性包括同义词如"crime=>criminality";如果同义词是一个文件,并且在config目录下,则可以通过synonym_path设置

    同义词规则

    • 显式同义词:crime=>criminality
    • 等效同义词:war, star wars
    • 扩展同义词:a,b => c,d a或b将被扩展到c和d
  • 相关阅读:
    [bzoj1500][luogu2042][cogs339][codevs1758]维修数列(维护数列)
    无旋treap的简单思想以及模板
    [hdu2036]改革春风吹满地
    (treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
    [bzoj3875][Ahoi2014]骑士游戏
    [bzoj1433][ZJOI2009]假期的宿舍
    <struct、union、enum>差异
    LeetCode(50) Pow(x,n)
    LeetCode(49)Group Anagrams
    LeetCode(48)Rotate Image
  • 原文地址:https://www.cnblogs.com/51zone/p/9795512.html
Copyright © 2020-2023  润新知