前言

最近想基于自定义的一些字段设计检索系统,听说可以使用Elasticsearch这一平台,因此特意探究了一下通过Elasticsearch搭建检索系统的过程。 首先去了解了Elasticsearch
Elasticsearch是基于Lucene的,所以它的评分机制也是基于Lucene的。在Lucene中把这种相关性称为得分(score),确定文档和查询有多大相关性的过程被称为打分(scoring)。ES最常用的评分模型是 TF/IDF和BM25,TF-IDF属于向量空间模型,而BM25属于概率模型,但是他们的评分公式差别并不大,都使用IDF方法和TF方法的某种乘积来定义单个词项的权重,然后把和查询匹配的词项的权重相加作为整篇文档的分数。在ES 5.0版本之前使用了TF/IDF算法实现,而在5.0之后默认使用BM25方法实现。【本文使用的ES为7.16.1】

安装依赖

  • JDK 1.8以上
    ES是基于Java的,因此需要安装JDK
  • 经过调研,本文决定使用elasticsearch-head——一种针对于ES的客户端工具
    它的使用需要下载elasticsearch相应的包,并且需要电脑上安装nodejs
    【具体下载及安装方法可以参考这一篇】安装好后如下图
  • Chrome扩展程序——ElasticSearch Head
    扩展程序可以帮助在网页端便捷访问,在Chrome扩展程序中搜索并启用即可
  • python 3.9
pip install elasticsearch

客户端启动

进入elasticsearch/bin的文件夹,启动终端

./elasticsearch

es模型打分插件_搜索引擎

在浏览器打开http://localhost:9200/,会得到如下内容:

es模型打分插件_Elastic_02

后端执行

这一部分是为了建立自定义字段的索引,首先需要一个存储自定义字段的文件,以我的文件为示例,这个文件在我的代码里被命名为test_json2es.txt

{"title": "流动和城市家庭中母亲的控制策略与幼儿顺从行为", "a-summary": " ", "a-method": "对122名3岁幼儿及其母亲(流动家庭46户)进行评估,考察母亲控制策略的特点、母亲控制策略与幼儿顺从行为的关系以及家庭类别和性别在二者关系中的调节作用。", "a-result": "结果表明:(1)流动和城市母亲使用最多的均是命令性控制;流动家庭母亲使用的强制性控制多于城市母亲,温和控制略少于城市母亲。(2)两类家庭中,不同强度的母亲控制都与幼儿的情境性顺从相关。(3)流动家庭母亲的强制性控制正向预测男孩的合作性顺从,负向预测其不顺从;流动家庭母亲的强制性控制负向预测女孩的合作性顺从。", "a-highlight": "", "r-summary": "", "r-method": "", "r-result": "", "r-highlight": "论文整体上写作较为规范,统计方法使用正确"}
{"title": "正念训练提升3~4岁幼儿注意力和执行功能", "a-summary": "为了考察正念训练对3~4岁幼儿注意力和执行功能的影响。", "a-method": "采用前后测设计,对正念组进行每周2次,每次20~30分钟,共12次的正念训练;对照组不进行任何训练。", "a-result": "结果发现:(1)在注意力方面,正念组与对照组前测差异不显著,训练后正念组幼儿持续性注意力得分显著高于对照组。(2)在执行功能方面,正念组和实验组在抑制控制、认知灵活性以及工作记忆上前测得分差异不显著,训练后正念组幼儿抑制控制和认知灵活性得分显著优于对照组,而两组幼儿工作记忆差异不显著。研究表明,正念训练促进了3~4岁幼儿注意力和执行功能的发展,且在执行功能方面主要表现为对抑制控制和认知灵活性的提升。", "a-highlight": "", "r-summary": "并考察正念训练对幼儿执行功能的影响", "r-method": "本文对比了正念训练干预组和空白对照组两组3-4岁幼儿在注意力,执行功能,认知灵活性和工作记忆上的差异。^本研究对3-4岁幼儿进行正念训练选题", "r-result": "目前对幼儿进行正念干预的研究较少,本研究具有较好的研究价值。", "r-highlight": "具有一定的创新性。"}
{"title": "高功能孤独症幼儿空间工作记忆的组块加工缺陷", "a-summary": "考察高功能孤独症幼儿是否存在组块加工缺陷,并探讨组块加工是否直接影响到空间工作记忆容量。", "a-method": "研究采用Sternberg空间工作记忆任务、Corsi空间广度任务,加入刺激结构化因素.实验1采用Sternberg空间工作记忆任务,实验2采用Corsi空间广度任务。", "a-result": "结果表明,ASD幼儿存在明显的组块加工缺陷。在易于组块的高结构化条件下,健康幼儿的记忆成绩明显较高,而ASD幼儿在高、低结构化条件下的记忆成绩并无显著差异。实验2结果显示,不论高、低结构化条件,ASD幼儿的空间工作记忆容量均显著低于健康幼儿。但ASD幼儿由于存在组块加工缺陷,在高、低结构化条件下的记忆成绩差异较健康幼儿小。因此,ASD幼儿的组块能力一定程度上影响了空间工作记忆容量。此外,记忆存储器的异常可能也是ASD幼儿空间工作记忆容量不足的重要原因。研究表明,ASD幼儿的空间组块缺陷主要由于弱中央统合的认知风格,他们缺乏自上而下的组块加工动机,难以主动对刺激形成高水平组块编码,从而影响记忆效果。", "a-highlight": "", "r-summary": "论文考察了高功能孤独症幼儿和正常幼儿工作记忆组块加工的差异^考察了 ASD儿童空间工作记忆能力受组块策略加工的影响", "r-method": "两个行为学实验", "r-result": "发现相较健康儿童, ASD儿童存在明显组块策略的缺陷并进而影响其工作记忆容量。", "r-highlight": "研究具有一定的科学意义和应用价值,实验设计、结果、结论基本合理,写作规范^具有一定的研究意义和创新性。"}
{"title": "4~6岁幼儿经济博弈中的信任行为及其影响因素", "a-summary": "考察幼儿是否在博弈任务中表现出对陌生人的信任行为,同时考察可能对幼儿的信任产生影响的因素,包括个体认知因素(观点采择)和环境因素(负性反馈和代际传递)。", "a-method": "本研究通过两个实验^研究对189名,4~6岁幼儿及其家长进行多种任务的测量。^实验一通过修订Evans和Krugger(2011)的信任博弈任务,考察幼儿在匿名信任博弈中的信任行为实验二考察了幼儿信任的影响因素", "a-result": "结果发现与4岁幼儿相比,6岁幼儿对他人的信任更低;^结果发现,幼儿在得到负性反馈结果后再次进行信任博弈任务时,他们对他人的信任比前次有所降低,6岁幼儿对他人返还数量的预期比4岁幼儿下降程度更大;6岁幼儿的信任行为(第一次给出意愿)与观点采择能力显著相关;6岁幼儿的信任水平与家长的信任水平显著相关。", "a-highlight": "", "r-summary": "考察了4-6岁幼儿在信任博弈任务上的表现差异,及其与家长信任程度、观点采择能力的关系。", "r-method": "行为实验", "r-result": "", "r-highlight": "研究选题有一定的理论和现实意义,研究程序基本得当。^文字流畅,条理清晰,数据分析合理。"}
{"title": "幼儿在地图任务中对自我位置与自我朝向的结合", "a-summary": "探讨了5~6岁幼儿在地图使用中结合自我位置和自我朝向表征的能力。", "a-method": "使用地图−空间和空间−地图两种地图定向任务,设置需同时表征自我位置和自我朝向的任务情境", "a-result": "结果发现:(1)位置选择和朝向选择同时正确的比率显著高于概率水平;(2)被试在位置选择上的准确性显著高于朝向选择;(3)位置表征与朝向表征之间的关系在不同任务条件下表现出一定的差异。^这些结果说明,5~6岁幼儿在使用地图时已经能够同时关注空间位置与朝向,实现位置表征与朝向表征的结合。", "a-highlight": "", "r-summary": "试图考察儿童如何在使用地图时同时关注位置和朝向信息^论文探讨了幼儿在地图任务中对自我位置与自我朝向的结合^该研究通过一个实验考察了中国5-6岁儿童在位置和环境在空间位置和空间朝向表征的现状", "r-method": "本研究测量了5-6岁儿童在一个同时涉及位置与朝向的地图定位任务上的表现", "r-result": "", "r-highlight": "小巧而富有创意,设计较为严谨,写作较为规范,无疑也得到了有价值的研究结果。^选题具有一定新意,所涉及的问题对于相关领域可能有启发作用。^总体来看,研究具有创新性,也具有潜在的应用价值。"}
{"title": "幼儿对威胁性刺激蛇的注意觉察:来自眼动证据", "a-summary": "探索威胁性刺激蛇是否被更快注意定向、作为干扰刺激的蛇是否同样能被更快觉察,以及蛇的特殊外形是否在快速觉察中具有重要作用。", "a-method": "研究选取4~6岁幼儿和成人被试,改进了刺激材料呈现范式和线画的刺激材料,采用3×3刺激矩阵呈现的方式,利用眼动仪记录被试的视觉搜索过程", "a-result": "实验1发现,相对于目标物花,成人和幼儿对蛇的首次注视到达时间更短,注视到目标前的注视点个数更少,首次注视的时间更短。实验2采用线画的方式去除了刺激材料的色彩和纹理,只保留了蛇蜿蜒的外形,结果发现儿童和成人仍然以更短的注视到达时间、更少注视次数注意到蛇,对蛇的首次注视时间更短。此外,对干扰物分析发现,蛇作为干扰物(花为目标物)仍然表现出更快注意定向。两个实验对比发现,被试对彩色、真实蛇的注视快于线画的蛇。结论认为,即使是对蛇具有较少经验的幼儿,也表现出了对蛇的快速注意偏向;蛇的色彩和纹理会促进蛇的快速觉察;蛇的低水平知觉特征(蜿蜒外形)确实对蛇的注意觉察具有重要作用。", "a-highlight": "", "r-summary": "探讨了幼儿对威胁性刺激蛇的注意觉察。", "r-method": "本研究采用眼动技术和经典的蛇-花配对范式,通过两个实验", "r-result": "在理论上,研究结果支持了知觉模板假设。^作者在研究手段上、刺激物及刺激物的呈现方式方式上都进行了有益的尝试。", "r-highlight": ""}
{"title": "面孔吸引力和信息正确性对幼儿选择性信任的影响", "a-summary": "", "a-method": "实验1采用3×2×2的混合设计,考察4~6岁幼儿获取全新信息时基于面孔吸引力的选择性信任及其特点。^实验2采用2×3的被试间设计,探讨信息提供者提供信息的正确性对4~6岁幼儿基于面孔吸引力的选择性信任的影响。", "a-result": "实验1结果显示:(1)4~6岁的男孩和女孩均表现出对高面孔吸引力者的选择性信任。(2)在选择性信任程度方面:5岁比4岁高,而4岁和6岁之间、5岁和6岁之间则相同;女孩在询问任务中比男孩表现出更高的选择性信任,在赞同任务中则相同。实验2结果显示:在正确性为50%vs.50%条件下,幼儿未对信息提供者产生选择性信任;在正确性为25%vs.75%条件下,幼儿对提供较大正确性信息的低面孔吸引力者产生了选择性信任。研究结果表明:(1)在信息缺乏时,4~6岁幼儿普遍存在有偏见的选择性信任;女孩比男孩更易受到社会偏见因素的影响。(2)在信息明确时,4~6岁幼儿也能做出相对理性的选择性信任。", "a-highlight": "", "r-summary": "本研究考察面孔吸引力和信息正确性对4-6岁幼儿选择性信任的影响^探讨了信息提供者的面孔吸引程度和提供的信息特征对4-6岁幼儿选择性信任的影响。", "r-method": "论文采用了实验法", "r-result": "本研究针对已有研究中存在的不足进行了解释和改进,并进一步对提供的信息特征进行了研究,具有一定的意义", "r-highlight": "实验设计较为严谨,结果清楚。^该文章设计合理,结果可靠。"}
{"title": "幼儿在地图任务中自我位置与自我朝向表征能力的发展", "a-summary": "探讨了不同任务模式下,4~6岁幼儿自我位置与自我朝向表征能力的发展特点。", "a-method": "使用地图定向任务,", "a-result": "结果发现,位置表征能力的获得先于朝向表征能力,幼儿从4岁起即开始使用地图表征自我位置,但到5岁才表现出对自我朝向的表征能力。此外,对于年龄较小的儿童,相比于空间–地图的任务模式,地图–空间的任务模式更有利于完成任务。", "a-highlight": "上述结果第一次从个体发展层面证明了位置与朝向表征的分离现象,说明位置与朝向的表征能力在发展过程中具有一定的顺序性。", "r-summary": "探讨了幼儿自我位置与自我朝向表征能力的发展特点,比较了不同任务模式的发展特点。", "r-method": "该文使用地图定向任务,通过3(年龄:4岁、5岁、6岁)×2(任务类型:位置、朝向)×2(任务模式:地图-空间、空间-地图)的三因素混合设计", "r-result": "", "r-highlight": " "}
{"title": "冲突情境下幼儿的选择性信任和信念修正", "a-summary": " ", "a-method": "在动态的“线索-靶子”范式中引入隧道刺激,以靶子与线索的非空间特征相同时的反应延迟测量返回抑制效应。^实验1利用单向隧道创设客体的空间位置信息明确且可靠的条件,考察客体的颜色特征在返回抑制中的作用。实验2利用双向隧道创设客体的空间位置信息不明确的条件,考察客体的颜色特征在返回抑制中的独立作用。^实验3、4分别采用与实验1、2类似的方法,在动态任务情景中考察客体的身份特征在返回抑制中的作用。", "a-result": "结果显示,线索呈现与靶子呈现的时间间隔较长时,4个实验中均存在显著的返回抑制效应。^这表明,动态情景中,客体的空间位置信息明确且可靠时,颜色特征和身份特征在返回抑制中都发挥着重要作用;客体的空间位置信息不明确时,颜色特征和身份特征在返回抑制中也都具有相对独立的作用。", "a-highlight": " ", "r-summary": "探讨了幼儿选择性信任问题的研究。", "r-method": "", "r-result": "该研究在认知发展和社会性发展这两个领域的结合上研究了幼儿的知识发展的心理机制,也可以为学前教育实践提供理论指导。", "r-highlight": "该研究具有一定的理论意义和实践价值。"}
{"title": "工作记忆训练提升幼儿流体智力表现", "a-summary": "考察工作记忆训练对流体智力的提升及保持效应。", "a-method": "本研究选择了幼儿园4~5岁幼儿进行工作记忆训练任务^实验中设立3个组:实验组、控制1组和控制2组。实验组采用单个空间n-back的工作记忆游戏程序进行训练,控制1组采用“水果忍者”的游戏程序进行训练,两组进行游戏训练的时间均为14天,每天15min;控制2组不进行任何训练。", "a-result": "结果发现,训练后实验组幼儿被试的流体智力成绩明显优于两个控制组,在6个月后再进行测试,这种优势仍然保持。^本研究结果表明,n-back工作记忆训练可以提高幼儿的流体智力成绩,并且这种训练效果具有持续的稳定性。", "a-highlight": "", "r-summary": "", "r-method": "", "r-result": "此研究对理解工作记忆及流体智力的发展有重要的理论意义,而且对幼儿基本认知能力的培养有现实意义。", "r-highlight": "文章思路清晰,实验设计合理,实验结果可靠。"}
{"title": "新入园幼儿的皮质醇变化与上呼吸道感染的关系:气质的作用", "a-summary": "考察新入园的59名幼儿皮质醇变化与两个月期间患URI次数、持续时间的关系,同时检测了幼儿气质在其中的作用。", "a-method": "采用酶联免疫吸附法分析唾液皮质醇和日志记录上呼吸道感染(upperrespiratorytractinfection;URI)的方法,", "a-result": "结果发现,新入园幼儿在国庆小长假后的第一周内,其皮质醇变化的整体趋势表现为下午的皮质醇水平比上午的皮质醇水平高;上、下午皮质醇水平的变化幅度与其患URI次数显著负相关,注意分散度与患URI次数呈显著正相关,幼儿的自我控制能力与其患URI的平均持续时间显著负相关;趋避性能够调节上、下午皮质醇水平变化幅度与URI的平均持续时间的关系。研究表明,幼儿面对新入园这一急性压力事件时,皮质醇水平的暂时性升高对免疫系统产生了一定的刺激作用来抵抗URI。幼儿气质的认知、情绪的或注意的不同过程与URI以及对皮质醇变化水平与URI关系的作用机制有所不同。", "a-highlight": " ", "r-summary": "此研究使用测定唾液皮质醇变化的方法评估压力,采用呼吸道感染日志记录评估免疫功能,采用问卷和实验范式方法评估气质,从而综合研究三者之间的关系,并发现三者之间的关联。", "r-method": "此研究使用测定唾液皮质醇变化的方法评估压力,采用呼吸道感染日志记录评估免疫功能,采用问卷和实验范式方法评估气质,从而综合研究三者之间的关系,并发现三者之间的关联。", "r-result": "", "r-highlight": "幼儿在新入园适应期的应激情况与上呼吸道感染的相关研究具有一定的实践价值。"}

执行代码为:

# coding:utf8
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk


def set_data(inptfile):
    f = open(inptfile, 'r', encoding='UTF-8')
    print(f.readlines())


class ElasticObj:
    def __init__(self, index_name, index_type, ip):
        """
        :param index_name: 索引名称
        :param index_type: 索引类型
        """
        self.index_name = index_name
        self.index_type = index_type
        # 无用户名密码状态
        self.es = Elasticsearch([ip])
        # 用户名密码状态
        # self.es = Elasticsearch([ip],http_auth=('elastic', 'password'),port=9200)

    def create_index(self):
        '''
        创建索引,创建索引名称为ott,类型为ott_type的索引
        :param ex: Elasticsearch对象
        :return:
        '''
        # 创建映射
        _index_mappings = {
            "mappings": {
                self.index_type: {
                    "properties": {
                        "title": {
                            'type': 'text'
                        },
                        "a-summary": {
                            'type': 'text'
                        },
                        "a-method": {
                            'type': 'text'
                        },
                        "a-result": {
                            'type': 'text'
                        },
                        "a-highlight": {
                            'type': 'text'
                        },
                        "r-summary": {
                            'type': 'text'
                        },
                        "r-method": {
                            'type': 'text'
                        },
                        "r-result": {
                            'type': 'text'
                        },
                        "r-highlight": {
                            'type': 'text'
                        }
                    }
                }

            }
        }
        if self.es.indices.exists(index=self.index_name) is not True:
            res = self.es.indices.create(index=self.index_name, body=_index_mappings, ignore=400)
            print(res)

    # 插入数据
    def insert_data(self, inputfile):
        f = open(inputfile, 'r', encoding='UTF-8')
        data = []
        for line in f.readlines():
            # 把末尾的'\n'删掉
            print(line.strip())
            # 存入list
            data.append(line.strip())
        f.close()

        ACTIONS = []
        i = 1
        bulk_num = 2000
        for list_line in data:
            # 去掉引号
            list_line = eval(list_line)
            # print(list_line)
            action = {
                "_index": self.index_name,
                "_type": self.index_type,
                "_id": i,  # _id 也可以默认生成,不赋值
                "_source": {
                    "title": list_line["title"],
                    "a-summary": list_line["a-summary"],
                    "a-method": list_line["a-method"],
                    "a-result": list_line["a-result"],
                    "a-highlight": list_line["a-highlight"],
                    "r-summary": list_line["r-summary"],
                    "r-method": list_line["r-method"],
                    "r-result": list_line["r-result"],
                    "r-highlight": list_line["r-highlight"]},
            }
            i += 1
            ACTIONS.append(action)
            # 批量处理
            if len(ACTIONS) == bulk_num:
                print('插入', i / bulk_num, '批数据')
                print(len(ACTIONS))
                success, _ = bulk(self.es, ACTIONS, index=self.index_name, raise_on_error=True)
                del ACTIONS[0:len(ACTIONS)]
                print(success)

        if len(ACTIONS) > 0:
            success, _ = bulk(self.es, ACTIONS, index=self.index_name, raise_on_error=True)
            del ACTIONS[0:len(ACTIONS)]
            print('Performed %d actions' % success)


if __name__ == '__main__':
    obj = ElasticObj("test", "en", ip="127.0.0.1")
    obj.create_index()
    obj.insert_data("./data/test_json2es.txt")

这段代码可以帮助建立自定义字段的索引

浏览器访问

在浏览器打开ES的扩展程序网页,点击上方的“连接”,旁边的“集群健康值”有颜色就是连接成功。

红色部分应该是我自定义的检索部分

es模型打分插件_python_03


在基本查询里选择要查询的文档、字段,输入查询词即可开始搜索。

es模型打分插件_elasticsearch_04