Spring boot 如何在Spring boot中实现对非结构化数据的搜索弹性搜索与MongoDB的集成
我是elasticsearch的新手,想知道以下案例是否适合我 我想在非结构化数据上实现搜索功能,我的意思是我不知道一个模型有什么类型的字段,正如下图所示,我在一个模型中有一个数据属性,其中可以包含任何类型的数据 我知道如何使用mongo connect连接mongodb和elasticsearch,但我不知道能否达到要求Spring boot 如何在Spring boot中实现对非结构化数据的搜索弹性搜索与MongoDB的集成,spring-boot,elasticsearch,Spring Boot,elasticsearch,我是elasticsearch的新手,想知道以下案例是否适合我 我想在非结构化数据上实现搜索功能,我的意思是我不知道一个模型有什么类型的字段,正如下图所示,我在一个模型中有一个数据属性,其中可以包含任何类型的数据 我知道如何使用mongo connect连接mongodb和elasticsearch,但我不知道能否达到要求 这个答案是基于你最后的评论 例如,假设您的数据字段映射如下所示: PUT my_index { "mappings": { "properties": {
这个答案是基于你最后的评论 例如,假设您的
数据
字段映射如下所示:
PUT my_index
{
"mappings": {
"properties": {
"data": {
"type": "nested"
}
}
}
}
正如您所看到的,我们没有在模式中插入字段,elastic将在索引第一个文档时为我们这样做
插入新文档:
POST my_index/_doc/1
{
"data" : {
"adType" : "SELL",
"price" : "2000",
"numberOfRooms" : 20,
"isNegotiable" : "true",
"area" : 200
}
}
如果我们想搜索单词SELL
,但不知道分配给它的是哪个字段,那么我们可以使用以下查询:
GET my_index/_search
{
"query": {
"nested": {
"path": "data",
"query": {
"multi_match": {
"query": "2000",
"fields": [],
"type": "best_fields"
}
}
}
}
}
我们设置字段=[]
意味着:
如果未提供任何字段,则multi_match查询默认为index.query.default_字段索引设置,后者又默认为*提取映射中符合术语查询条件的所有字段,并筛选元数据字段。然后将所有提取的字段合并以生成查询
我们得到的结果是:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"data" : {
"adType" : "SELL",
"price" : "2000",
"numberOfRooms" : 20,
"isNegotiable" : "true",
"area" : 200
}
}
}
]
}
}
更新
插入文件
POST my_index/_doc/1
{
"data" : "SELL 2000 20 true 200"
}
然后您的查询:
GET my_index/_search
{
"query": {
"match":
{
"data":"SELL 2000"
}
}
}
在spring中使用QueryBuilder
QueryBuilder qb = QueryBuilders.matchQuery("data", "SELL 2000");
我希望这就是您正在寻找的内容。如果我目前了解,您确实知道
数据属性存在,但您不知道其中包含哪些字段。我说得对吗?没错,我不确定我的前端会有什么,因为每个模型都有独特的属性,但它们的核心是相同的。如果我将所有未知字段保存为一个带有空格的巨大字符串,您认为我可以实现相同的搜索功能吗@Assaelazran如果我将数据中的所有信息作为一个长字符串,并对其进行搜索,会怎么样?因为有些字段可能不是搜索所必需的,例如iscoveratible,我们对此不感兴趣,所以我可以省略一些字段@AssaelAzranYou可以这样做。将值放入一个字符串(数据字段)中。然后对一个特定的值进行简单的匹配查询。对一个特定的值?这是一个巨大的值,我将搜索整个字符串,对吗?这样可以实现相同的搜索功能吗?我说得对吗@阿塞尔·阿兹兰:是的,你是对的,但它不会给你精确的匹配。查看我的更新。向下滚动直到你看到UPDATELet我尝试一下,我会让你知道@Assael Azran是否有效。无论如何谢谢你