1

业务需求规定,为了实现全文搜索解决方案,正在搜索的某些字段比其他字段具有更大的权重。虽然我发现您可以自己为搜索词添加权重,但我不确定它是否满足我们的需求。

让我提供基本设置,也许我在设置中遗漏了一些东西,而不是在查询时,或两者兼而有之?

使用多列数据存储创建 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
}
4

0 回答 0