Использование Oracle хранилища текстовых данных из нескольких столбцов Могу ли я по-разному взвешивать столбцы - PullRequest
0 голосов
/ 29 февраля 2020

Бизнес-требование требует, чтобы при реализации решения для полнотекстового поиска определенные поля поиска имели больший вес, чем другие. Хотя я обнаружил, что вы можете добавить вес самим поисковым терминам, я не уверен, что они удовлетворяют наши потребности.

Позвольте мне предоставить базовую настройку c, и, возможно, я что-то упустил в Настройка, а не во время запроса, или и то, и другое?

Основа c Настройка для создания Oracle Текстового индекса с использованием многоколоночного хранилища данных.

Я создаю таблицу из 40 столбцов от имени адрес, номер телефона, бизнес и т. д. c.

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 Текст, если это возможно:

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
}
...