Любой способ объединить два запроса в Solr? - PullRequest
2 голосов
/ 05 октября 2011

В моем проекте мы используем solr для индексации большого количества документов различного типа, например Книги и Персоны, с некоторыми общими полями (например, именем) и некоторыми специфическими для типа полями (такими как категория или группа людей).принадлежат).

Мы хотели бы выполнить запросы, которые могут найти как книги, так и людей, для каждого типа документа применяются некоторые фильтры.Примерно так:

  • найти все Книги и Персоны с "Джин" в названии и / или содержании
  • , но только Книги из категории "художественная литература" и "фантастика"
  • и только лица из группы "панголин"
  • все отсортировано по баллам

Очень простой способ сделать это будет:

q = name:jean content:jean
&
fq= 
    (type:book AND category:(fiction fantasy)) 
    OR 
    (type:person AND group:pangolin)

Ноувы, поскольку fq кэшируется, я бы предпочел что-то, что позволило бы мне упростить и сделать более многократно используемым fq, например:

  • fq=type:book,
  • fq=type:person,
  • fq=category(fiction fantasy),
  • fq=group:pangolin.

Можно ли сказать, что solr объединяет или объединяет много запросов?Что-то вроде «группировки» fq вместе.

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

Ответы [ 3 ]

3 голосов
/ 07 октября 2011

Как отметил Герт-Ян в своем ответе, возможность сделать OR между fq - это функция запроса Solr, но пока с очень небольшой поддержкой: https://issues.apache.org/jira/browse/SOLR-1223

Итак, мне удалось смоделировать то, что я хочу, простым способом:

  • для каждого поля, которое может иметь тип документа, мы должны каждый раз определять значение (поэтому, если в моем собственном примере у книг не может быть категории, во время индекса мы все равно должны определить что-то вроде category=noCategoryCode
  • при использовании фильтра для одного из этих полей в запросе для нескольких типов мы добавляем в фильтр отсутствующее условие, поэтому fq=category:fiction становится fq=category:fiction (*:* AND -category:*)

Таким образом, все другие типы (например, Person) будут проходить через этот фильтр, и этот фильтр будет довольно атомарным и часто используемым, поэтому кэширование все еще полезно.

Итак, мой полный пример:

q = name:jean content:jean
&
fq= type:(book person)
&
fq= category:(fiction fantasy) (*:* AND -category:*)
&
fq= group:(pangolin) (*:* AND -group:*)

Тем не менее, не могу дождаться исправления SOLR-1223:)

0 голосов
/ 06 октября 2011

Возможно, я не понимаю вашу проблему, но единственное различие между запросом и фильтром состоит в том, что фильтр кэшируется.Если вас не волнует кэширование, просто измените их запрос:

real query +((type:book category:fiction) (type:person group:pangolin))

0 голосов
/ 05 октября 2011

Вы можете применить несколько запросов фильтра одновременно

q=name:jean content:jean&fq=type:book&fq=type:person&fq=category(fiction fantasy)&fq=group:pangolin

...