Solr условные поля запроса (qf)

Можно ли определить поля запроса в Solr на основе определенных условий? Например, у меня есть три поля text, title и product. Определение конфигурации solr:

<str name="qf">text^0.5 title^10.0 Product</str>

То, что я ищу здесь, - это включение "продукта" в качестве поля поиска только при соблюдении определенных условий, например, если автор:"Том", а затем выполнить поиск по продукту.

Есть ли способ сделать это во время запроса, используя edismax?

Альтернативный вариант - добавить информацию о продукте в текст или заголовок документа (где автор = Том) во время индексации, чтобы его можно было искать. Но я пытаюсь избежать этого, если это возможно.

Любые указатели будут оценены.

-Спасибо

3 ответа

Решение

Для поиска в разных полях на основе разных условий необходимо сначала выполнить поиск по этим конкретным условиям, поэтому он более или менее совпадает с выдачей нескольких запросов.


Тем не менее, в случае необходимости сделать это как одноразовый запрос (например, для сортировки / группировки / других функций поиска "из коробки"), могут использоваться вложенные запросы.

Для определения двух различных условий (как в первоначальном вопросе, но его можно легко расширить с помощью большего количества предложений ИЛИ), q Параметр может получить следующее значение:

_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}"
OR
_query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}"

Запрос использует разыменование параметров, поэтому нет необходимости вручную экранировать какие-либо специальные символы перед передачей параметров в solr.

  • fq1 - первое особое условие
  • qf1 - список полей для поиска первого специального условия (fq1)
  • fq2 - второе особое условие
  • qf2 - список полей для поиска первого специального условия (fq2)
  • condQuery - фактический поисковый термин / запрос

Fq1 может быть пустым для определения базовой линии (в данном конкретном случае - поиск в text а также title, но не в product).

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

fq1=&qf1=text^0.5 title^10.0&fq2=author:"Tom"&qf2=text^0.5 title^10.0 Product&condQuery=5

И последний запрос будет выглядеть примерно так:

http://localhost:8983/solr/collection1/select?q=_query_%3A%22%7B!edismax+fq%3D%24fq1+qf%3D%24qf1+v%3D%24condQuery%7D%22+OR+_query_%3A%22%7B!edismax+fq%3D%24fq2+qf%3D%24qf2+v%3D%24condQuery%7D%22&fl=*%2Cscore&wt=xml&indent=true&fq1=&qf1=text^0.5%20title^10.0&fq2=author:%22Tom%22&qf2=text^0.5%20title^10.0%20Product&condQuery=5

.. или тот же запрос, возвращаемый solr в ответе solr (предоставляется только для структурированного отображения):

<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
        <lst name="params">
            <str name="q">_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}" OR _query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}"</str>
            <str name="condQuery">5</str>
            <str name="indent">true</str>
            <str name="fl">*,score</str>
            <str name="fq1"/>
            <str name="qf1">text^0.5 title^10.0</str>
            <str name="fq2">author:"Tom"</str>
            <str name="qf2">text^0.5 title^10.0 Product</str>
            <str name="wt">xml</str>
        </lst>
    </lst>
    <result name="response" numFound="..." start="..." maxScore="...">
        ...
    </result>
</response>

Даже при том, что это работает, я предлагаю рассмотреть влияние, которое это окажет на время запроса (поскольку каждое условие будет иметь отдельный внутренний поисковый запрос) и измерить, как это влияет на ваш конкретный случай.

Shamik,

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

Если вы действительно хотите сделать что-то подобное, возможно, вы можете сделать два вызова в Solr, чтобы получить набор результатов.

Я не пробовал сам, но похоже, что этого можно достичь с помощью http://wiki.apache.org/solr/FunctionQuery

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