微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OrientDB JSON 数据中的全文搜索

如何解决OrientDB JSON 数据中的全文搜索

我在 OrientDB 3.0.27 中有以下数据,其中一些值在 JSON 数组中,一些是字符串

{
    "@type": "d","@rid": "#57:0","@version": 2,"@class": "abc_class","user_name": [
        "7/1 LIBOR Product"
    ],"user_Accountability": [],"user_Rollout_32_date": [],"user_Brands": [
        "AppNet"
    ],"user_lastModificationTime": [
        "2019-11-27 06:40:35"
    ],"user_columnPercentage": [
        "0.00"
    ],"user_systemId": [
        "06114a87-a099-0c30c60b49c4"
    ],"user_lastModificationUser": [
        "system"
    ],"system_type": "Product","user_createDate": [
        "2017-10-27 09:58:42"
    ],"system_modelId": "bian_model","user_parent": [
        "a12a41bd-af6f-0ca028af480d"
    ],"user_Strategic_32_value": [],"system_oeId": "06114a87-a099-0c30c60b49c4","user_description": [],"@fieldTypes": "user_name=e,user_Accountability=e,user_Rollout_32_date=e,user_Brands=e,user_lastModificationTime=e,user_columnPercentage=e,user_systemId=e,user_lastModificationUser=e,user_createDate=e,user_parent=e,user_Strategic_32_value=e,user_description=e"
}

我尝试了以下查询

select * from `abc_class ` where any() = ["AppNet"]  limit 2;
select * from `abc_class ` where any() like '%a099%'  limit 2;

上述两个查询都有效,因为它们都尊重字段的数据类型。

我想运行一个包含查询,该查询将在具有任何数据类型(如字符串、数字、JSON 数组等)的任何字段中进行搜索,更像是 - 全文搜索

select * from `abc_class ` where any() like '%AppNet%'  limit 2;

上述查询不起作用,因为实际值在 JSON 数组中。尝试了几乎所有来自 filtering section documentation

的东西

如何使用现有数据实现全文搜索之类的功能

编辑#1

现在做了更多的研究后,我至少可以将数组值转换为字符串,然后像操作符一样运行它,如下所示;

select * from `abc_class` where user_name.asstring() like '%LIBOR%'

然而,使用 any().asstring() 不会产生任何结果

select * from `abc_class` where any().asstring() like '%LIBOR%'

如果可以通过某种方式增强上述查询以将任何列作为字符串查询,那么问题就可以解决了。

解决方法

如果需要搜索所有的列值,那么我们可以创建一个全行数据的 JSON 对象并将其转换为 String。

然后用like关键字查询字符串,如下:

select * from `abc_class` where @this.toJSON().asString() like '%LIBOR%'

如果我们将直接转换为 @this.asString(),那么我们将获得数组元素的计数,而不是数组元素内的真实数据,如下所示:

abc_class#57:4{system_modelId:model,system_oeId:14f4b593-a57d-4d37ad070a10,system_type:Product,user_lastModificationUser:[1],user_name:[1],user_description:[0],user_Accountability:[0],user_lastModificationTime:[1],user_Rollout_32_date:[0],user_Strategic_32_value:[0],user_createDate:[1],user_Brands:[0],user_parent:[1],user_systemId:[1],user_columnCompletenessPercentage:[1]} v2

因此,我们需要先转成JSON再转成String来查询全记录使用@this.toJSON().asString()

参考文献:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?