Solr - одинаковые результаты поиска результатов для нескольких поисковых терминов? - PullRequest
1 голос
/ 25 января 2012

Хотелось бы узнать, как можно получить разные оценки для результатов поиска по нескольким терминам?

Некоторые результаты в solr имеют одинаковую оценку, даже если в запросе несколько терминов, как вы увидите в примере ниже.

У меня есть два индекса в Solr, каждый из которых содержит: id,first_name, last_name Каждый индекс будет выглядеть следующим образом:

<doc>
    <str name="id">1</str>
    <str name="last_name">fisher</str>
    <str name="name">john</str>
</doc>

<doc>
    <str name="id">2</str>
    <str name="last_name">darby</str>
    <str name="name">john</str>
</doc>

Когда я запрашиваю только «john», появляются оба результата.Это идеально.Однако, когда я спрашиваю «Джон Фишер», оба результата появляются, но с одинаковым счетом.То, что я хочу, это различные оценки, основанные на релевантности условий поиска.

Вот результат для следующего запроса http://localhost:8983/solr/select?q=john+fisher%0D%0A&rows=10&fl=*%2Cscore

<response>
    ...
    <result name="response" numFound="2" start="0" maxScore="0.85029894">
        <doc>
            <float name="score">0.85029894</float>
            <str name="id">1</str>
            <str name="last_name">fisher</str>
            <str name="name">john</str>
        </doc>

        <doc>
        <float name="score">0.85029894</float>
            <str name="id">2</str>
            <str name="last_name">darby</str>
            <str name="name">john</str>
        </doc>
    </result>
</response>

Любая помощь будет принята с благодарностью

Ответы [ 3 ]

3 голосов
/ 25 января 2012

Лучше всего вам понять и проанализировать, как различные факторы влияют на оценку документа. Lucene имеет полезную функцию Explanation. Используйте Solr, чтобы определить, как рассчитывается оценка, вы можете использовать debugQuery в Solr, чтобы увидеть, как она получается

?q=john&fl=score,*&rows=2&debugQuery=on

Ex Response:

<lst name="debug">
    <str name="rawquerystring">john</str>
    <str name="querystring">john</str>
    <str name="parsedquery">+DisjunctionMaxQuery((text:john))</str>
    <str name="parsedquery_toString">+(text:john)</str>
    <lst name="explain">
        <!-- Score calulation for Result#1 -->
        <str>
            2.1536596 = (MATCH) fieldWeight(text:john in 36722), product of:
            1.0 = tf(termFreq(text:john)=1)
            8.614638 = idf(docFreq=7591, maxDocs=15393998)
            0.25 = fieldNorm(field=text, doc=36722)
        </str>
        <!-- Score calulation for Result#2 -->
        <str>
            2.1536596 = (MATCH) fieldWeight(text:john in 36724), product of:
            1.0 = tf(termFreq(text:john)=1)
            8.614638 = idf(docFreq=7591, maxDocs=15393998)
            0.25 = fieldNorm(field=text, doc=36724)
        </str>
    </lst>

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

?q=john&fl=score,*&rows=2&debugQuery=on&explainOther=on

Читайте:

1 голос
/ 26 января 2012

Мне кажется, что вы ищете только в поле "имя".Вот почему оценки одинаковы.Если вы используете DisMax , вы можете легко выполнять поиск по обоим полям, и наиболее релевантные будут иметь более высокий балл.

например,

<str name="defType">edismax</str>
<str name="qf">name last_name</str>

Другой способ - объединить 2поля в 1 поле с copyField и поиск только во вновь созданном поле.

0 голосов
/ 26 января 2012

Спасибо за быстрый ответ, ребята, я ценю это.

Из запроса объяснения я смог определить, что поиск действительно проводился только по одному полю.

Я видел, что можно добавить несколько полей в одно поле для поиска. В schema.xml я добавил следующее:

<copyField source="last_name" dest="text"/>

Результаты теперь соответствуют ожидаемым при использовании более одного поискового запроса.

...