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.