Solr: fieldNorm, отличающийся на документ, без повышения документа

Я хочу свои результаты поиска заказать счетом, который они делают, но счет вычисляется неправильно. Это должно сказать, не обязательно неправильно, но по-другому, чем ожидалось, и я не уверен почему. Моя цель состоит в том, чтобы удалить то, что изменяет счет.

Если я выполняю поиск, который соответствует на двух объектах (где ObjectA, как ожидают, будет иметь более высокий счет, чем ObjectB), ObjectB возвращается сначала.

Скажем, для этого примера, что мой запрос является единственным термином: "яблоки".

Заголовок ObjectA: "яблоки являются яблоками" (2/3 условия)
Описание ObjectA: "Были яблоки в яблоках яблок, и теперь яблоки пошли все яблоки на всем протяжении яблок!" (6/18 условия)
Заголовок ObjectB: "яблоки являются большими" (1/3 условия)
Описание ObjectB: "Были яблоки в комнате яблок, и теперь яблоки пошли все плохо на всем протяжении яблок!" (4/18 условия)

Поле заголовка не имеет никакого повышения (или скорее повышение 1), и поле описания имеет повышение 0,8. Я не указал повышение документа через solrconfig.xml или через запрос, через который я прохожу. Если существует другой способ указать повышение документа, существует шанс, что я пропускаю тот.

После анализа explain распечатка, похоже, что ObjectA правильно вычисляет более высокий счет, чем ObjectB, точно так же, как я хочу, за исключением одного различия: заголовок ObjectB fieldNorm всегда выше, чем ObjectA.


Здесь следует explain распечатка. Именно так Вы знаете: поле заголовка mditem5_tns и поле описания mditem7_tns:

ObjectB:
1.3327172 = (MATCH) sum of:
  1.0352166 = (MATCH) max plus 0.1 times others of:
    0.9766194 = (MATCH) weight(mditem5_tns:appl in 0), product of:
      0.53929156 = queryWeight(mditem5_tns:appl), product of:
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.8109303 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
        1.0 = tf(termFreq(mditem5_tns:appl)=1)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        1.0 = fieldNorm(field=mditem5_tns, doc=0)
    0.58597165 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of:
      0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of:
        0.8 = boost
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.3581977 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of:
        2.0 = tf(termFreq(mditem7_tns:appl)=4)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.375 = fieldNorm(field=mditem7_tns, doc=0)
  0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of:
    0.999001 = 1000.0/(1.0*float(1)+1000.0)
    1.0 = boost
    0.2977981 = queryNorm

ObjectA:
1.2324848 = (MATCH) sum of:
  0.93498427 = (MATCH) max plus 0.1 times others of:
    0.8632177 = (MATCH) weight(mditem5_tns:appl in 0), product of:
      0.53929156 = queryWeight(mditem5_tns:appl), product of:
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.6006513 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
        1.4142135 = tf(termFreq(mditem5_tns:appl)=2)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.625 = fieldNorm(field=mditem5_tns, doc=0)
    0.7176658 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of:
      0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of:
        0.8 = boost
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.6634457 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of:
        2.4494898 = tf(termFreq(mditem7_tns:appl)=6)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.375 = fieldNorm(field=mditem7_tns, doc=0)
  0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of:
    0.999001 = 1000.0/(1.0*float(1)+1000.0)
    1.0 = boost
    0.2977981 = queryNorm
6
задан sehe 23 January 2015 в 07:33
поделиться

2 ответа

Проблема вызвана стеммером. Он заменяет «яблоки есть яблоки» на «яблоки есть яблоки», что делает поле длиннее. Поскольку документ B содержит только 1 термин, который расширяется стеммером, поле остается короче, чем документ A.

Это приводит к другим fieldNorms.

6
ответ дан 16 December 2019 в 21:34
поделиться

FieldNOrm вычисляется из 3 компонентов - index-time boost для поля, index-time boost для документа и длина поля. Если предположить, что вы не предоставляете никакого увеличения времени индекса, то разница должна быть длиной поля.

Таким образом, поскольку lengthNorm выше для более коротких значений поля, для того, чтобы B имел более высокое значение fieldNorm для заголовка, он должен иметь меньшее количество лексем в заголовке, чем A.

Подробное объяснение скоринга Lucene смотрите на следующих страницах:

http://lucene.apache.org/java/2_4_0/scoring.html http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Similarity.html

2
ответ дан 16 December 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: