Создание пользовательских FunctionQuery в Solr - PullRequest
0 голосов
/ 16 февраля 2020

Я хочу создать пользовательский Solr FunctionQuery, чтобы я мог получить фактическую длину поля (в терминах). Результаты могут выглядеть следующим образом:

{
  "responseHeader":{
    "status":0,
    "QTime":8,
    "params":{
      "q":"python",
      "indent":"on",
      "fl":"title,score,[features efi.query=python store=myfeature_store]",
      "wt":"json"}},
  "response":{"numFound":793,"start":0,"maxScore":0.33828905,"docs":[
      {
        "title":"Newest 'python' Questions - Stack Overflow",
        "score":0.33828905,
        "[features]":"titleLength=5"},
      ]
  }}

Единственная полезная ссылка, которую я могу найти, это this . Но это не очень хорошо объясняет топи c. Я очень новичок в Solr, поэтому пошаговая процедура будет полезна.

EDIT

Я создал js скрипт с именем count.js как следует:

function WordCount(str) { 
  return str.split(" ").length;
}

function processAdd(cmd) {
    doc = cmd.solrDoc;  // org.apache.solr.common.SolrInputDocument
    var title = doc.getFieldValue("title");
    var count = WordCount(title);
    doc.setField("title_count", count);
    logger.info("count-script#count: title_count=" + count);
}

function processDelete(cmd) {
  // no-op
}

function processMergeIndexes(cmd) {
  // no-op
}

function processCommit(cmd) {
  // no-op
}

function processRollback(cmd) {
  // no-op
}

function finish() {
  // no-op
}

Кроме того, я добавил следующие записи в solrconfig.xml:

<initParams path="/update/**">
    <lst name="defaults">
      <str name="update.chain">script</str>
    </lst>
  </initParams>

<updateRequestProcessorChain name="script">
    <processor class="solr.StatelessScriptUpdateProcessorFactory">
      <str name="script">count.js</str>
    </processor>
    <processor class="solr.RunUpdateProcessorFactory" />
  </updateRequestProcessorChain>

У меня есть несколько вопросов:

  1. Чтобы это работало, нужно ли переиндексировать документы с помощью Nutch?
  2. Как проверить, работает ли он? Будет ли простой запрос solr работать как http://localhost:8983/solr/nutch/select?indent=on&q=*:*&wt=json?

1 Ответ

1 голос
/ 18 февраля 2020

Вы можете использовать обработчик запросов на обновление. Довольно много способов сделать это.

Проверьте CountFieldValuesUpdateProcessorFactory

Вы в основном клонируете свое поле и рассчитываете его. Но это будет работать только тогда, когда ваше поле источника многозначно. То есть, прежде чем передать его Solr, вы их токенизируете. Вы конфигурируете это в своем SolrConfig. xml

    <updateRequestProcessorChain name="word-counter">
  <processor class="solr.CloneFieldUpdateProcessorFactory">
    <str name="source">title</str>
    <str name="dest">title_count</str>
  </processor>
  <processor class="solr.CountFieldValuesUpdateProcessorFactory">
    <str name="fieldName">title_count</str>
  </processor>
  <processor class="solr.DefaultValueUpdateProcessorFactory">
    <str name="fieldName">title_count</str>
    <int name="value">0</int>
  </processor>
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

Но помните, что для этого требуется, чтобы у вас был «заголовок» как многозначный, что может быть не идеальным. Вы можете иметь дополнительное поле, например «title_multi», и маскировать ваш процесс.

В качестве альтернативы, вы можете использовать ScriptUpdateProcessor и выполнять подсчет логики c в Javascript.

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