业务需求规定,为了实现全文搜索解决方案,正在搜索的某些字段比其他字段具有更大的权重。虽然我发现您可以自己为搜索词添加权重,但我不确定它是否满足我们的需求。
让我提供基本设置,也许我在设置中遗漏了一些东西,而不是在查询时,或两者兼而有之?
使用多列数据存储创建 Oracle Text 索引的基本设置。
我创建了一个包含 40 列的表,从名称到地址、电话号码、业务等。
create table full_search_tab
( id integer
, dummy_search_col char(1)
, first_name varchar2(30)
, middle_name varchar2(30)
, last_name varchar2(50));
然后我为数据存储创建一个首选项(实际上我将在列列表中包含所有 40 列,但仅列出一些用于演示):
exec ctx_ddl.create_preference('multi_ds', 'MULTI_COLUMN_DATASTORE');
exec ctx_ddl.set_attribute('multi_ds', 'columns', 'LAST_NAME,FIRST_NAME,MIDDLE_NAME');
我创建索引:
create index full_search_mcds_ctx_idx on full_search_tab(dummy_search_col) indextype IS ctxsys.context
parameters ('datastore multi_ds');
现在,当我查询索引时,它的行为类似于 Google 搜索。我们会将自由格式文本传递给所有术语都使用 AND 运算符的查询。我们希望某些列的点击权重高于其他列 => 提供修改后的评分。例如,我们总是希望列 last_name 在匹配任何项时的权重高于所有其他项,而 middle_name 的权重较低。
我不确定的是,有可能做到这一点吗?是否在索引之前使用首选项?还是每个查询都这样?
对于那些熟悉 Elasticsearch 查询的人,如果可能的话,我想使用 Oracle Text 复制这个查询语法:
GET full_search_mcds_ctx_idx/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"type":"cross_fields",
"query": "john m smith",
"operator": "and",
"fields": [
"LastName^2",
"MiddleName^0.2",
"FirstName^1.2"]
}
}
]
}
},
"size": 0
}