ElasticSearch+Neo4j+ElasticSearch Head实现全文检索应用

本文详细介绍了在Linux环境中通过Elasticsearch 7.17.4和Neo4j 3.5.28实现全文检索的过程,包括ES配置、Neo4j-elasticsearch集成、Elasticsearch-head测试以及利用ApoC API进行高级查询。重点展示了如何在图谱支持下进行复杂查询和语义搜索的准备工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要阐述利用ES、知识图谱(Neo4j)实现全文检索,并利用ElasticSearch Head开源项目进行全文检索测试。实验在图谱的帮助下如何开展全文检索功能,为后续的复杂查询或语义检索做准备。
一、运行环境
1.Linux 7.5
2.JDK 1.8.0_191
3.ElasticSearch 7.17.4,注意用ES自带的jdk,因为这个版本的ES需要JDK11以上,配置见第二条内容。
4.Neo4j 3.5.28
二、ES和Neo4j的安装配置:
详细的安装配置本文略去,主要给出关键配置信息,可以参考其他安装配置,如大家需要,再咨询我。
1. 配置ES--java11环境:打开ES的bin下面elasticsearch和elasticsearch-cli文件,在最前面添加如下信息,将默认jdk调整为es自带的jdk,这样不改变整个系统的java环境,只是在运行ES时用指定的java环境。
#配置自己的jdk11
export JAVA_HOME=/home/es/elasticsearch-7.17.4/jdk
export PATH=$JAVA_HOME/bin:$PATH
2.配置ES--在config目录,打开 elasticsearch.yml,配置信息如下
node.master:true 或者 node.name: node-1
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
#允许各种http请求
http.cors.allow-methods: OPTIONS,HEAD,GET,POST,PUT,DELETE
http.cors.allow-headers: Content-Type,Accept,Authorization,x-requested-with
#集群节点存储空间大小限制解决的配置选项
cluster.routing.allocation.disk.threshold_enabled: false
cluster.initial_master_nodes: ["node-1"]
#配置X-Pack,401问题解决的配置选项
xpack.security.enabled: false
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
3.启动ElasticSearch
前面配置完毕后,基本可以启动ES了,进入bin目录,运行 elasticsearch 或者 elasticsearch -d,后者表示后台启动,如果出现如下错误,请安装要求配置。
错误1 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
root 用户:vi /etc/sysctl.conf 添加 vm.max_map_count=262144:保存退出之后,执行命令 sysctl -p
错误2max number of threads is too low
root 用户:vi /etc/security/limits.conf 在文件最后添加
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
错误3max number of threads [1024] for user [elasticsearch] is too low, increase to at least [4096],该错误对应的配置文件,默认配置好了, 不需要单独配置。
vi /etc/security/limits.d/90-nproc.conf 改为4096
修改完记得退出es用户,再执行启动命令。
cp -r /home/hadoop/app/elasticsearch-7.17.4 /home/es/elasticsearch-7.17.4
4.查看ES运行情况(浏览器)
http://192.168.107.128:9200/ 查看可用情况
5.配置访问ES的用户密码,主要用于配置ElasticSearch-head和Kibana客户端访问ES的用户密码。
执行命令:elasticsearch-setup-passwords interactive
user:elastic/kibana_system/其他用户等
pwd:eses456
其他用户的密码同上。
6.安装plugin
安装IK分词器:elasticsearch-plugin install analysis-icu
查看安装的plugin elasticsearch-plugin list
删除pluginelasticsearch-plugin remove analysis-icu
7.配置用户自定义配置词典,进入es的config下,进入analysis-ik,打开IKAnalyzer.cfg.xml,配置自定义词典信息如下:
<entry key="ext_dict">userdefine.dic</entry>
userdefine.dic配置如下信息,重启ES后就会自动整体分词。
美团
地层
储层
8.配置Neo4j- elasticsearch
下载neo4j-elasticsearch-3.5.6.jar,放在neo4j的plugin目录下。
配置neo4j,neo4j.conf
elasticsearch.host_name= http://192.168.107.128:9200
elasticsearch.index_spec=result:result( name),resultsummary:resultSummary(abstract,name),resultkeys:resultKeys(name)  #这里的第一个result表示节点标签,第二个result表示ES中的result索引名称,name表示将result节点中name属性值。 多个索引关联见下一行的示例(中间逗号分隔)
9.Elasticsearch-head配置:下载完成后进入根目录,启动前端项目后直接运行(npm run start)。
elasticsearch-head主要是验证在Neo4j插入新的节点和关系时,数据同时同步到ES中,并测试是否提供全文检索等。
问题: elasticsearch- head无法连接ES的问题及解决方案
打开es配置文件,看看是否有以下几行配置信息。即可解决。
#允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
#允许各种http请求
http.cors.allow-methods: OPTIONS,HEAD,GET,POST,PUT,DELETE
http.cors.allow-headers: Content-Type,Accept,Authorization,x-requested-with
#401问题解决的配置选项
xpack.security.enabled: false
#集群节点存储空间大小限制解决的配置选项
cluster.routing.allocation.disk.threshold_enabled: false
三、全文检索应用实践
(一)直接在控制台下,运行测试Neo4j或Neo4j和ES配置是否正常,具体如下:
查询(neo4j):
curl -X POST http: / /192.168.107.128:7474/db /data/cypher -H 'authorization: Basic bmVvNGo6bmVvbmVv' -H 'content-type: application/json' -d '{ "query" : "MATCH (n:result{name:'张三') Return n" }'
查询(es):
创建新节点(neo4j+es):
curl -X POST http: / /192.168.107.128:7474/db /data/cypher -H 'authorization: Basic bmVvNGo6bmVvbmVv' -H 'content-type: application/json' -d '{ "query" : "CREATE (n:result { name: { name1 }}) RETURN n" , "params" : { "name1" : "测试20221218"  } }'
(二)利用apoc调用ES(官方- ElasticSearch - APOC Extended Documentation
1. 查看es状态:  call  apoc . es . stats ( "192.168.107.128" )
2.查询检索:
CALL apoc.es.getRaw("192.168.107.128",'resultsummary/_search?',null) YIELD value 
UNWIND value.hits.hits as hits
RETURN hits['_source'] LIMIT 100
3.查询,关键词过滤-dsl query
CALL apoc.es.getRaw("192.168.107.128","resultsummary/_search?",{
  query: {match_phrase:{name: "处理"}}
})
YIELD value 
UNWIND value.hits.hits as hits
RETURN hits['_source'] LIMIT 100
4.查找resultsummary索引中name包含处理的节点,并返回符合查询的title列表
CALL apoc.es.getRaw("192.168.107.128","resultsummary/_search?",{
  query: {match_phrase:{name: "处理"}}
})
YIELD value 
UNWIND value.hits.hits as hits
UNWIND hits['_source']['name'] as name_list RETURN name_list
5.查找 knowledgegraph索引中title包含"python"的节点,并返回符合查询的title列表,并查询与包含"python"的result节点相连的一度ACTED_IN边
CALL apoc.es.getRaw("192.168.107.128","knowledgegraph/_search?",{
  query: {match_phrase:{title: "python"}}
})
YIELD value 
UNWIND value.hits.hits as hits
with collect(hits['_source']['title']) as title_list 
MATCH p=(m:result)-[r:ACTED_IN]-(n) where m.name in title_list RETURN p
四、Neo4j自带的全文检索插件应用。
1.查看分词器: call  db . index . fulltext . listAvailableAnalyzers
2.创建索引: CALL  db . index . fulltext . createNodeIndex ( "summaryFullIndex" ,[ "resultSummary" ],[ "name" ],  {  analyzer :  "cjk" })
3.使用索引:
查找包含储层评价的报告
CALL db.index.fulltext.queryNodes("summaryFullIndex","储层评价") YIELD node, score
RETURN node, score
查找即包含综合,又做过核磁或密度的数据
CALL db.index.fulltext.queryNodes("summaryFullIndex","综合") YIELD node
where node.name contains "合成"  
where node.name contains "密度" 
return node  
order by node.name  
skip 0
limit 10
4.删除全文索引
call db.index.fulltext.drop("summaryFullIndex")
### 实现中药知识图谱可视化 #### 添加必要的依赖项 为了在Spring Boot项目中实现中药知识图谱的可视化,首先需要配置`pom.xml`文件来引入所需的依赖。这不仅限于Web开发的基础组件如`spring-boot-starter-web`[^1],还需要加入用于连接Neo4j数据库的支持包以及任何其他可能需要用到的技术栈中的工具,比如Elasticsearch对于全文检索支持或是Vue.js作为前端框架的一部分[^2]。 ```xml <dependencies> <!-- Spring Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Neo4j Driver --> <dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java-driver</artifactId> </dependency> <!-- Other dependencies as needed, e.g., Elasticsearch, Vue integration etc. --> </dependencies> ``` #### 数据库配置与集成 接着,在应用程序属性文件(application.properties 或 application.yml)里定义好MySQL和Neo4j的数据源设置[^4]。这里假设已经有一个存储着关于中药材及其关系的信息模型存在于Neo4j之中,并且可以通过Cypher查询语句获取到这些结构化数据以便后续处理。 ```yaml # application.yml example snippet spring: datasource: url: jdbc:mysql://localhost:3306/herb_db?useSSL=false&serverTimezone=UTC username: root password: secret neo4j: uri: bolt://localhost:7687 username: neo4j password: password ``` #### 创建RESTful API端点 通过编写控制器类提供HTTP请求入口点,使得能够从客户端发起对服务器的操作指令并返回相应的JSON格式响应体给浏览器或其他消费者应用。此类通常会负责解析传入参数、执行业务逻辑操作(例如向Neo4j发出查询)、最后组装成易于理解的结果集发送回去[^3]。 ```java @RestController @RequestMapping("/api/graph") public class GraphController { @Autowired private final GraphService graphService; public GraphController(GraphService service){ this.graphService = service; } @GetMapping(value="/nodes", produces="application/json") ResponseEntity<List<Node>> getNodes(){ List<Node> nodes = graphService.getAllNodes(); return new ResponseEntity<>(nodes, HttpStatus.OK); } } ``` #### 前端页面设计 利用现代JavaScript框架之一——Vue.js构建交互式的用户界面,该界面上将显示由后端API所提供的节点列表以及其他关联信息。当访问者打开网站时,默认加载的是一个名为`index.html`的静态资源文件;而实际的内容渲染工作则交给了嵌套在其内的脚本标签所指向外部JS模块完成。 ```html <!-- index.html excerpt --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>Herbal Knowledge Visualization</title> <script src="./app.js"></script> </head> <body> <div id="app"></div> </body> </html> ``` ```javascript // app.js simplified version using Vue CLI setup or similar tooling. new Vue({ el: '#app', data() { return { herbs: [] }; }, mounted() { axios.get('/api/graph/nodes') .then(response => (this.herbs = response.data)); } }); ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一望无际的大草原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值