CFSearch Solr с использованием списка в настраиваемом поле

Я пытаюсь проиндексировать около 30000 записей базы данных в одной коллекции, и в соответствии с моими требованиями я должен иметь возможность включить список элементов в одно настраиваемое поле и использовать его в своем поиске.

Вот пример моего индекса:

<cfindex collection = "myCollection" 
             action = "refresh"
             type = "custom"
             query = "Local.myQuery" 
             key = "ID" 
             title="Title"
             applications_s="A_Comma_Separated_List"
             body = "a_field,a_nother_field">

В этом примере application_s - это динамическое настраиваемое поле (введено в CF10), содержащее список идентификаторов приложений. Пример содержимого для этого поля:

T1,T2,B4,G1

Это все великолепно индексирует, однако я не смог понять, как искать, используя один элемент в списке приложений в качестве критерия.

Итак, я хотел бы иметь возможность сделать это:

<cfsearch name="Local.qSearch"
    collection="myCollection"
    criteria="test AND applications_s:T1">

Это должно вернуть все записи, которые содержат слово "test" в теле, а также содержат "T1" в области приложений. Однако я не могу найти синтаксис критерия, который будет обрабатывать содержимое настраиваемого поля как список, разделенный запятыми... он, кажется, работает только как строка. Поэтому моя примерная запись не будет возвращена, если я не укажу подстановочный знак, что может вызвать проблемы с ошибкой при возврате дополнительных записей.

Есть ли способ явно указать, что мое настраиваемое поле является списком и должно содержать указанное значение?

1 ответ

Решение

Мне удалось заставить следующее работать на CF9.0.1. Хотя MYCUSTOMNAME_TYPE (например, applications_s) поля только для CF10, я смог использовать поле custom1 и указать его как "строковый" тип, отредактировав файл schema.xml и перезапустив Solr. Вы не должны были бы на CF10.

1) В запросе, который вы индексируете, добавьте ДВА запятых в начало столбца списка приложений и ОДИН в конце, чтобы пример строки выглядел так:

,,T1,T1B,T2,B4,G1,

Вы можете сделать это либо в своем SQL, используя конкатенацию (предпочтительно), либо постобработкой результата запроса с помощью Query-of-Queries, либо QueryNew() и циклически обрабатывая запрос для создания копии.

2) Индексируйте запрос с помощью cfindex как в вашем вопросе, используя applications_s чтобы убедиться, что поле является строковым типом, а не текстом. Мы не хотим, чтобы список был "токенизирован" как слова. Запятые имеют решающее значение, и мы не хотим, чтобы их игнорировали.

3) В вашем cfsearch дополнить критерии следующим образом:

<cfset searchString= "test">
<cfset applicationFilter = "T1">
<cfsearch name="Local.qSearch"
    collection="myCollection"
    criteria="#searchString# AND applications_s:,*,#applicationFilter#,*">

Обратите внимание, что есть 3 запятых и 2 подстановочных знака в целом. Первая запятая здесь, потому что вы не можете начать запрос Solr с подстановочным знаком. Вторая и третья запятые гарантируют, что поиск по шаблону для T1 не соответствует T1B.

Другие вопросы по тегам