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