Elasticsearch + Search UI 构建一个文件搜索引擎

news2024/11/13 15:08:53

目录

  • Elasticsearch
    • 使用优势
    • App Search
  • Search UI
    • 配置engine
    • 集中管理配置和提供实用工具函数
    • 配置和初始化一个基于Elasticsearch的搜索界面应用程序
    • Search UI 基础用法
  • 好书推荐

在这里插入图片描述

Elasticsearch

使用优势

使用ElasticSearch的主要好处在于其强大的全文搜索实时分析能力。ElasticSearch基于Apache Lucene构建,提供了高性能、可扩展的搜索解决方案,支持复杂的搜索查询,如模糊搜索、全文搜索、多字段搜索、地理空间搜索等。它能够自动处理文本分析,如分词、索引和查询优化,从而极大地提升了搜索速度和准确性。此外,ElasticSearch支持分布式部署,能够轻松处理PB级数据,保证了系统的高可用性和可扩展性。无论是用于构建搜索引擎、日志分析、实时监控还是其他需要高效搜索和分析的场景,ElasticSearch都能提供强大的技术支持和灵活的配置选项,帮助用户快速响应业务需求。

初步使用Elasticsearch包括下面的步骤

  • 运行 Elasticsearch 和 Kibana(使用 Elastic Cloud 或在本地 Docker 开发环境中),
  • 向 Elasticsearch 添加简单(无时间戳)数据集,
  • 运行基本搜索。

Elasticsearch 入门指南

App Search

App Search 建立在 Elasticsearch 之上,为您的应用程序提供丰富的开箱即用搜索功能。App Search 包括:

  • 一组用于提取内容的 RESTful API
  • 直观的仪表板
  • 实时搜索查询和点击分析
  • 查询相关性调整
  • 支持查询同义词
  • 支持语言优化引擎
  • 支持 API 客户端

Search UI

Search UI 是一个基于React 实现的一套UI框架(可以嵌套在任何JS框架,包括Vue框架)用于使用Elastic快速开发现代、引人入胜的搜索体验。无需重新设计轮子,即可快速启动并运行。
vue版本案例
Search UI入门指南
使用App Search创建Search UI
Search UI API

注意:使用官方vue版本,需要用特定的class 对ES返回的<em>标签进行设置。

配置engine

Elasticsearch查询的JSON配置,如引擎名称、端点基础、搜索密钥、结果字段、排序字段、过滤器、标题字段和URL字段。

{
  "engineName": "es-plugins-file",//引擎名称
  "endpointBase": "/elastic_serve",//查询的基础URL部分
  "searchKey": "",//搜索密钥
  "resultFields": [//结果字段
    "actLine",
    "classId",
    "deptId",
    "className",
    "deptName",
    "stuName",
    "fileContent",
    "fileName",
    "filePath",
    "fileType",
    "fileUrl",
    "parentId",
    "stuId",
    "uploadDate",
    "uploadDateStr",
    "uploadTime",
    "uploadTimeStr",
    "id"
  ],
  "sortFields": [//排序字段
    "uploadTime"
  ],
  "facets": [//过滤器
    "uploadDate",
    "classId",
    "deptId"
  ],
  "titleField": "fileName",//标题字段
  "urlField": "fileUrl"//URL字段
}

集中管理配置和提供实用工具函数

import config from "./engine.json";
export function getConfig() {
  if (process.env.NODE_ENV === "test") {
    return {};
  }

  if (config.engineName) return config;

  if (
    typeof window !== "undefined" &&
    window.appConfig &&
    window.appConfig.engineName
  ) {
    return window.appConfig;
  }

  return {};
}
//处理字符串
function toLowerCase(string) {
  if (string) return string.toLowerCase();
}

function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}
//获取标题字段
export function getTitleField() {
  // If no title field configuration has been provided, we attempt
  // to use a "title" field, if one exists
  return getConfig().titleField || "title";
}
//获取URL字段
export function getUrlField() {
  return getConfig().urlField;
}
//获取缩略图字段
export function getThumbnailField() {
  return getConfig().thumbnailField;
}
//获取过滤字段
export function getFacetFields() {
  return getConfig().facets || [];
}
//获取排序字段
export function getSortFields() {
  return getConfig().sortFields || [];
}
//获取结果标题
export function getResultTitle(result) {
  const titleField = getTitleField();

  return result.getSnippet(titleField);
}

//剔除不必要的结果字段。从结果字段中剔除不需要显示的字段,例如已配置为“标题”显示的字段。
export function stripUnnecessaryResultFields(resultFields) {
  return Object.keys(resultFields).reduce((acc, n) => {
    if (
      [
        "_meta",
        "id",
        toLowerCase(getTitleField()),
        toLowerCase(getUrlField()),
        toLowerCase(getThumbnailField()),
      ].includes(toLowerCase(n))
    ) {
      return acc;
    }

    acc[n] = resultFields[n];
    return acc;
  }, {});
}
//建搜索选项
export function buildSearchOptionsFromConfig(dateRange = null) {
  const config = getConfig();
  console.log('1123123123123123213213', config.searchFields, config.fields)
  const searchFields = (config.searchFields || config.fields || []).reduce(
    (acc, n) => {
      acc = acc || {};
      acc[n] = {};
      return acc;
    },
    undefined
  );


  const resultFields = (config.resultFields || config.fields || []).reduce(
    (acc, n) => {
      acc = acc || {};
      acc[n] = {
        raw: {},
        snippet: {
          size: 100,
          fallback: true
        }
      };
      return acc;
    },
    undefined
  );

  if (config.urlField) {
    resultFields[config.urlField] = {
      raw: {},
      snippet: {
        size: 100,
        fallback: true
      }
    };
  }

  if (config.thumbnailField) {
    resultFields[config.thumbnailField] = {
      raw: {},
      snippet: {
        size: 100,
        fallback: true
      }
    };
  }

  if (config.titleField) {
    resultFields[config.titleField] = {
      raw: {},
      snippet: {
        size: 100,
        fallback: true
      }
    };
  }

  const searchOptions = {};
  searchOptions.result_fields = resultFields;
  searchOptions.search_fields = searchFields;
  return searchOptions;
}

//构建过滤配置
export function buildFacetConfigFromConfig() {
  const config = getConfig();

  const facets = (config.facets || []).reduce((acc, n) => {
    acc = acc || {};
    acc[n] = {
      type:'value',
      size:100
    }
    return acc;
  }, undefined);

  return facets;
}

//构建排序选项
export function buildSortOptionsFromConfig() {
  const config = getConfig();
  return [
    {
      name: "Relevance",
      value: "",
      direction: ""
    },
    ...(config.sortFields || []).reduce((acc, sortField) => {
      acc.push({
        name: `${capitalizeFirstLetter(sortField)} ASC`,
        value: sortField,
        direction: "asc"
      });
      acc.push({
        name: `${capitalizeFirstLetter(sortField)} DESC`,
        value: sortField,
        direction: "desc"
      });
      return acc;
    }, [])
  ];
}
//构建自动完成查询配置
export function buildAutocompleteQueryConfig() {
  const querySuggestFields = getConfig().querySuggestFields;
  if (
    !querySuggestFields ||
    !Array.isArray(querySuggestFields) ||
    querySuggestFields.length === 0
  ) {
    return {};
  }

  return {
    suggestions: {
      types: {
        documents: {
          fields: getConfig().querySuggestFields
        }
      }
    }
  };
}

配置和初始化一个基于Elasticsearch的搜索界面应用程序

使用了@elastic/search-ui-app-search-connector来连接到Elasticsearch,并通过一系列的配置函数来设置搜索参数、自动完成查询、过滤器(facets)和排序选项。


//导入必要的模块:包括regenerator-runtime/runtime以支持异步操作,AppSearchAPIConnector用于连接到Elasticsearch,以及从./config-helper导入的配置构建函数。
import "regenerator-runtime/runtime";
import AppSearchAPIConnector from "@elastic/search-ui-app-search-connector";

import {
    buildAutocompleteQueryConfig,
    buildFacetConfigFromConfig,
    buildSearchOptionsFromConfig,
    buildSortOptionsFromConfig,
    getConfig,
    getFacetFields
} from "./config-helper";

//获取配置:通过getConfig函数获取应用程序的配置,包括搜索密钥(searchKey)、引擎名称(engineName)、主机标识符(hostIdentifier)和基础URL(endpointBase)。


const { hostIdentifier, searchKey, endpointBase, engineName } = getConfig();
//初始化API连接器:使用AppSearchAPIConnector创建一个新的连接器实例,传入必要的配置参数。
const connector = new AppSearchAPIConnector({
    searchKey,
    engineName,
    hostIdentifier,
    endpointBase
});

//构建配置对象:构建一个配置对象,其中包含搜索查询的配置、自动完成查询的配置、API连接器实例、以及其他相关设置,如是否在初始加载时总是执行搜索、是否跟踪URL状态。
const config = {
    searchQuery: {
        facets: buildFacetConfigFromConfig(),
        ...buildSearchOptionsFromConfig()
    },
    autocompleteQuery: buildAutocompleteQueryConfig(),
    apiConnector: connector,
    alwaysSearchOnInitialLoad: false,//设置为false意味着在组件首次加载时不会自动触发搜索,需要用户手动触发搜索或者在加载完成后根据其他条件动态决定是否搜索的场景。
    trackUrlState: false,// 禁用 URL 状态跟踪

};


export default config;

Search UI 基础用法

SearchDriver是一个用于集成Elasticsearch搜索功能到Vue应用程序的工具,用来初始化和管理搜索功能。config是之前定义的配置对象,包含了所有必要的设置以支持搜索操作。

import { SearchDriver } from "@elastic/search-ui";

创建SearchDriver的实例,并将之前构建的配置对象传递给它。这样做的目的是将配置好的搜索功能集成到Vue应用程序中,SearchDriver可能负责处理搜索请求、更新搜索结果、管理状态等任务。

const driver = new SearchDriver(config);

  • subscribeToStateChanges
    订阅搜索状态变化的事
  driver.subscribeToStateChanges(state => {
            // 搜索状态发生变化时,打印新的状态对象并执行相应的操作。
            this.searchState = state;
        });
  • getState
    这个方法通常用于获取当前搜索状态,包括搜索参数、过滤条件、排序选项等信息。
const {
            searchTerm,//搜索查询的关键词或短语。
            resultsPerPage,//每页显示的搜索结果数量。
            filters,//应用的过滤器列表。
            facets//可用于搜索结果细分的分面(facet)信息。
        } = driver.getState();
  • reset
    用于重置搜索状态到初始状态,清除所有之前的搜索参数、过滤条件和排序选项。
  driver.reset();
  • clearFilters
    用于清除所有当前应用的过滤条件,但不会重置其他搜索状态,如搜索关键字或排序选项。
driver.clearFilters();
  • getActions().setSearchTerm();
    调用SearchDriver实例的getActions方法来获取一个操作对象,然后通过这个操作对象设置搜索关键字。
  • setCurrent
    跳转到第几页
 driver.setCurrent();
  • getState().facets
    用于读取当前搜索状态中的特定信息

  • removeFilter
    从当前的搜索状态中移除过滤条件

  driver.removeFilter('classId');
  • addFilter
    向当前的搜索状态中添加过滤条件
driver.addFilter('classId',"具体值", "any");

好书推荐

《区块链编程》
区块链技术远超比特币背后的技术范畴,其概念实际上十分广泛。它凭借坚不可摧的安全性、去中心化交易以及可独立验证的供应链,已经彻底改变了货币、数字身份和物流等领域。借助以太坊和超级账本等平台,开发者可以利用熟悉的编程语言轻松上手区块链项目。
《区块链编程》以简明扼要的方式,教会读者如何设计和构建基于区块链的去中心化应用程序。首先,你将全面了解区块链的工作原理。随后,你将使用以太坊和Solidity编写你的首个智能合约。接着,你将逐步添加Web界面、信任验证等功能,直至准备好应用程序的部署。你只需配置好标准硬件和利用开源软件,便可轻松启程,踏上区块链编程的探索之旅。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM G1垃圾回收器简介与常用配置

简介 G1 is a generational, incremental, parallel, mostly concurrent, stop-the-world, and evacuating garbage collector which monitors pause-time goals in each of the stop-the-world pauses. 在内存空间划分上&#xff0c;G1将堆分为等大的一块区域&#xff08;regi…

手摸手系列之Linux下根据自己的jdk包构建docker镜像

项目在本地导出PDF文件正常&#xff0c;部署到Linux服务器docker容器中导出就报错&#xff0c;百撕不得姐&#xff0c;经查&#xff0c;docker依赖的openjdk版本是8u112版本&#xff0c;而我本地是8u421版本&#xff0c;那就升级jdk的小版本试试。 在docker的中央仓库[点我直达…

记录jenkins的一个错误

因为workspace 的权限多了一个s 导致构建镜像出现了失败 [rootsimetra-ecs-01 .jenkins]# ls -la | grep work -rw-r----- 1 root root 46 Aug 17 11:57 org.jenkinsci.plugins.workflow.flow.FlowExecutionList.xml drwxr-x--- 6 root root 4096 Aug 12 10:06 works…

【微信小程序】自定义组件 - 组件的生命周期

1. 组件全部的生命周期函数 2. 组件主要的生命周期函数 3. lifetimes 节点

OceanMind海睿思入选《2024中国企业数智化转型升级服务全景图/产业图谱》

近日&#xff0c;国内知名数据智能产业创新服务媒体数据猿携手上海大数据联盟发布了《2024中国企业数智化转型升级服务全景图/产业图谱1.0版》。中新赛克海睿思从数千家企业中脱颖而出&#xff0c;成功入选「底层技术服务 - 大数据」细分领域。 在历经数月的时间里&#xff0c;…

AI 代理参考架构

LLM Agent部署框架 围绕 ChatGPT 的讨论&#xff0c;现在已经演变为AI 代理。 图&#xff1a;AI代理平台参考架构 比尔盖茨最近设想&#xff08;CNBC 采访&#xff1a;链接&#xff09;未来我们将拥有一个能够处理和响应自然语言并完成许多不同任务的AI 代理。盖茨以计划旅行…

SD NAND的SD模式与SPI模式的初始化

最近很多客户朋友在询问我们CS创世 SD NAND能不能使用SPI接口&#xff0c;两者使用起来有何区别&#xff0c;下面为大家详细解答。 SD MODE: CS创世 SD NAND支持SD模式和SPI模式&#xff0c;SD NAND默认为SD模式&#xff0c;上电后&#xff0c;其初始化过程如下&#xff1a; …

陪跑案例 | 德国营养师吴迪:从胖妹逆袭塑形导师!公开首场发售秘籍

有目标&#xff0c;有心力的老师&#xff0c;一旦找对方法和团队&#xff0c;能够化解99%的问题。 今天&#xff0c;创客匠人【陪跑案例故事】专栏推出第四期内容&#xff0c;为大家介绍【梦想身型健康学院】平台创始人吴迪老师的陪跑故事。 吴迪老师是梦想身型训练营创始人、德…

Es-在java中使用

match_all match trem 范围查询 地理位置查询 算分函数 多条件bool查询 分页查询 高亮

mixly教程-ESP32接入文言一心

一、获取access_token 步骤一. 创建千帆应用 &#xff08;1&#xff09;登录百度智能云千帆控制台。 百度智能云-登录 &#xff08;2&#xff09;创建千帆应用 注意切换到旧版 &#xff08;3&#xff09;创建应用后&#xff0c;获取AppID、API Key、Secret Key。 步骤二. 服…

Leetcode 162.153.33 二分法 C++实现

Leetcode 162. 寻找峰值 问题&#xff1a;峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums &#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] num…

SpringBoot医疗废物管理系统 项目编号:200082(案例分析)

摘 要 随着医疗废物管理的重要性日益凸显&#xff0c;如何高效管理和处理医疗废物成为医疗机构面临的挑战。该系统涵盖存储间主管、运输员用户、处理地主管和管理员四个角色&#xff0c;旨在实现医废信息管理、出入库记录、运输信息跟踪、处理地信息管理等功能。通过技术手段…

警惕!“On Hold”期刊大变天!又3本被踢出WOS数据库,8月SCI/SSCI期刊目录更新!

【SciencePub学术】本期热点 WOS目录更新 又到了一月一度的科睿唯安官网更新Web of Science核心期刊目录的时候&#xff0c;小编今天带大家一起来看看最新的SCI/SSCI期刊目录有哪些变化吧。 来源&#xff1a;科睿唯安官网 继上次SCI期刊目录和SSCI期刊目录更新之后&#xff0c…

设计模式(单例模式、工厂模式、建造者模式、代理模式)

设计模式是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案&#xff08;设计思想、设计经验&#xff09;。 一、六大原则 1、单一职责原则&#…

[嵌入式 C 语言] 知识库

一、数据类型 1.1 基本数据类型 自定义类型基础类型占用字节数取值范围描述mls8char1-128 to 1278 位有符号整数mlu8unsigned char10 to 2558 位无符号整数mlvu8volatile unsigned char10 to 2558 位无符号整数&#xff0c;具有 volatile 属性mls16short2-32768 to 3276716 位…

TreeUtils 树工具类

数据展示&#xff1a; 如图&#xff1a;部门树数据 &#xff0c;树形的基础数据 id 、 parentId 、label 便可形成 嵌套对象字段如下&#xff1a;{id: 103, parentId: 101, label: "研发部门", weight: 1} 一、工具类 继承了 hutoo 的工具类 TreeUtil &#xff08…

springboot+Quartz通过数据库控制定时任务执行与时间

前言 在我们的springboot项目中&#xff0c;有很多种实现定时任务的方式 有用最简单的 Scheduled 实现定时任务,即&#xff1a; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;Component EnableScheduling p…

Arthas相关命令

官方网站&#xff1a;命令列表 | arthas 也可以用idea的插件arthas-idea的插件根据你想定位的代码生成命令 jvm 相关 dashboard - 当前系统的实时数据面板getstatic - 查看类的静态属性heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能jvm - 查看当前 JVM 的信息l…

Studying-刷题补充| 数组:58.区间和、44. 开发商购买土地

目录 58.区间和 44. 开发商购买土地 总结 58.区间和 文档讲解&#xff1a;代码随想录58.区间和 题目&#xff1a;58. 区间和&#xff08;第九期模拟笔试&#xff09; (kamacoder.com) 学习&#xff1a;本题最直接的做法是&#xff0c;将数组Array保存好后&#xff0c;通过…

linux - mathematica 安装教程

注意事项&#xff1a; 文件目录不能有空格&#xff0c;不能有中文 安装包 Mathematica - 12.1 安装 解压软件包 7z x Mathematica_12.1.1_LINUX_CN.zip运行安装器 命令运行后解压出Mathematica_12.1.1_LINUX_CN.sh, 运行该安装脚本 chmod x Mathematica_12.1.1_LINUX_CN…