Настройка способа поиска Solr в определенном поле

#solr

#solr

Вопрос:

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

Чтобы лучше понять контекст и вопрос, вот что я хочу сделать — у меня есть 5 полей, и все они будут текстовыми полями [не вдавайтесь слишком в синтаксис ..]

 <field>a</field> ==> will contain normal text [lazy fox jumps over ..]
<field>b</field> ==> will contain normal text [lazy fox jumps over ..]
<field>c</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6]
<field>d</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6]
<field>e</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6]
  

мой запрос будет выполнять поиск по всем этим 5 полям, а значения для полей c, d и e также будут содержать числовые значения, разделенные запятыми.

во время поиска я хотел бы выполнить пересечение между значением в запросе и значением внутри поля в индексе. Как я могу это сделать?

=> другой способ взглянуть на проблему заключается в том, что если одно из значений в поле запроса присутствует в поле внутри индекса, то я должен сопоставить этот документ, который будет возвращен обратно. Это выглядит как простой поиск «ИЛИ», но значения в каждом поле могут быть порядка 100. так что построение запроса OR для такого количества возможных входных значений, я думаю, не будет приятным. Если это хорошо масштабируется, то это может быть возможным решением, но я не был уверен, что оно будет хорошо масштабироваться.

Как я могу реализовать такую настройку? — производительность поиска / запроса является ключевым фактором, который будет рассмотрен.

Ответ №1:

для полей c d и e вам следует разделить значения (по разделителю) на другое многозначное поле. Как предлагает @Umar. После этого у вас будет единственное поле для поиска чисел (пусть это поле by называется «numbers»).

таким образом, ваш запрос становится

q=a: (запрос) b: (запрос) числа: (запрос)

предполагается, что оператором запроса по умолчанию является OR.

поле «numbers» должно быть строковым, если вы просто хотите выполнить поиск равенства. Это должно быть значение int, если вы хотите разрешить поиск в диапазоне по этим числам.

Если вы обеспокоены тем, что числа не всегда будут в предсказуемом формате (т. Е. получены из пользовательского ввода), вы можете скопировать содержимое полей с по e в одно текстовое поле. Это даст вам гораздо более широкие возможности сопоставления, но вы не сможете выполнять поиск по диапазону и тому подобное. IIRC, поле копирования SOLR позволит вам указать множество исходных полей для одного целевого поля без жалоб, но при загрузке документов целевое поле получит содержимое последнего выполненного поля копирования. Здесь это не сработает, и вам нужно будет объединить содержимое в одно поле в вашем коде.

Комментарии:

1. Проблема в том, что я не могу объединить все эти значения в одно поле. Они похожи на управление доступом, и каждое поле имеет значение, и даже если одно из полей не совпадает, я не должен сопоставлять документ. Это И для этих разных полей.

2. затем просто используйте текстовые поля для всех и используйте И внутри скобок и ИЛИ между полями. просто. Группируйте любые запросы к полю с помощью скобок. например. (a: (запрос) И b:(запрос)) ИЛИ (c:(запрос) ИЛИ d:(q1 И q2)) или любое другое логическое выражение, которое вы себе представляете.

3. спасибо за предложение, попробую это. есть какие-либо подсказки о том, какой будет производительность, когда у нас будут тысячи элементов в каждом поле? есть ли способ написать пользовательский компонент поиска, который может эффективно выполнять это в Solr. С помощью описанного выше подхода мы увеличиваем количество терминов запроса на огромное количество, и это будет применимо для каждого поиска в системе, поэтому я немного беспокоился о том, как будет работать этот дизайн.

Ответ №2:

для полей c d и e вы должны разделить значения с помощью разделителя и сохранить как многозначное поле, что позволит вам сопоставлять каждое отдельное значение.

таким образом, ваш запрос становится

 q=a:(query) b:(query) c:(query) d:(query) e:(query)
  

предполагается, что оператором запроса по умолчанию является OR.

Комментарии:

1. Оператор запроса по умолчанию применим только между правильными полями? т.е. между a, b, c, d и e. Можете ли вы указать оператор запроса по умолчанию для разных полей и внутри каждого поля? — другой способ — установить значение o по умолчанию равным OR и явно указать AND в запросе.

2. нет, оператор по умолчанию будет работать с любыми терминами, разделенными пробелом, если мы не сделаем их фразами, заключив в кавычки.

Ответ №3:

Вы можете использовать опцию copyField. Создайте некоторое поле с некоторым именем, например ‘composite’.

 <field name="composite" type="sometype" indexed="true" stored="false" multiValued="true">
  

установите сохраненный параметр false, чтобы избежать чрезмерного использования памяти.

Тот же тип, что и c d amp; e. Скопируйте поля c d amp; e в 'composite' .

 <copyField source="c" dest="composite">

<copyField source="d" dest="composite">

<copyField source="e" dest="composite">
  

Тогда ваш запрос будет выглядеть следующим образом:

 q=a:(query) AND composite:(query)
  

Комментарии:

1. вы можете использовать copyField только от одного источника к одному целевому. Не так много к одному, как вы предлагаете.

2. использование copyField выше верно, solr позволяет копировать столько полей, сколько требуется, в одно поле назначения. Если вы хотя бы проверите пример, вы увидите использование текста в качестве поля копирования в файле схемы по умолчанию. Хотя необходимо позаботиться об одной вещи, чтобы поле назначения было определено как многозначное поле.