Solr: fieldNorm отличается для каждого документа, без увеличения документа - PullRequest
6 голосов
/ 23 июня 2010

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

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

Допустим, для этого примера, что мой запрос представляет собой один термин: «яблоки».

Название объекта A: "яблоки - яблоки" (2/3 условия)
Описание объекта А: «В яблоках-яблоках были яблоки, и теперь яблоки разложили все яблоки по всем яблокам!» (6/18 семестров)
Заголовок объекта B: «яблоки великолепны» (1/3 условия)
Описание объекта B: "В яблочной комнате были яблоки, и теперь яблоки испортились!" (4/18 семестров)

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

После анализа распечатки explain похоже, что ObjectA является , правильно вычисляя более высокий балл, чем ObjectB, точно так же, как я хочу, за исключением разницы one : поле заголовка ObjectBNorm равно всегда выше чем у 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

Ответы [ 2 ]

6 голосов
/ 23 июня 2010

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

Это приводит к различным полевым нормам.

2 голосов
/ 23 июня 2010

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

Таким образом, поскольку 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

...