Отрегулируйте результат поиска Lucene по весу отдельных полей с одинаковыми именами. - PullRequest
4 голосов
/ 14 апреля 2011

В настоящее время я использую Lucene в качестве нашей системы полнотекстового поиска. Но нам нужно отсортировать результаты поиска по определенному полю.

Например, если в нашем индексе есть следующие три документа с точно содержимым, за исключением поля id.

    val document01 = new Document()
    val field0100 = new Field("id", "1", Field.Store.YES, Field.Index.ANALYZED)
    val field0101 = new Field("contents", "This is a test: Linux", Field.Store.YES, Field.Index.ANALYZED)
    val field0102 = new Field("contents", "This is a test: Windows", Field.Store.YES, Field.Index.ANALYZED)
    document01.add(field0100)
    document01.add(field0101)
    document01.add(field0102)

    val document02 = new Document()
    val field0200 = new Field("id", "2", Field.Store.YES, Field.Index.ANALYZED)
    val field0201 = new Field("contents", "This is a test: Linux", Field.Store.YES, Field.Index.ANALYZED)
    val field0202 = new Field("contents", "This is a test: Windows", Field.Store.YES, Field.Index.ANALYZED)
    document02.add(field0200)
    document02.add(field0201)
    document02.add(field0202)

    val document03 = new Document()
    val field0300 = new Field("id", "3", Field.Store.YES, Field.Index.ANALYZED)
    val field0301 = new Field("contents", "This is a test: Linux", Field.Store.YES, Field.Index.ANALYZED)
    val field0302 = new Field("contents", "This is a test: Windows", Field.Store.YES, Field.Index.ANALYZED)
    document03.add(field0300)
    document03.add(field0301)
    document03.add(field0302)

Теперь, когда я ищу Linux с помощью IndexSearcher, я получаю следующий результат:

Document<stored,indexed,tokenized<id:1> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>
Document<stored,indexed,tokenized<id:2> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>
Document<stored,indexed,tokenized<id:3> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>

Когда я ищу Windows, я получаю тот же результат с тем же порядком.

Document<stored,indexed,tokenized<id:1> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>
Document<stored,indexed,tokenized<id:2> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>
Document<stored,indexed,tokenized<id:3> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>

Вопрос в том, возможно ли взвешивать определенные поля при построении индекса? Например, я хотел бы, чтобы make field0201 имел более высокий балл, если он соответствовал при поиске.

Другими словами, когда я ищу Linux, я хотел бы получить результат в следующем порядке:

Document<stored,indexed,tokenized<id:2> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>
Document<stored,indexed,tokenized<id:1> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>
Document<stored,indexed,tokenized<id:3> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>

И когда я ищу Windows, он по-прежнему остается в исходном порядке, как показано ниже:

Document<stored,indexed,tokenized<id:1> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>
Document<stored,indexed,tokenized<id:2> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>
Document<stored,indexed,tokenized<id:3> stored,indexed,tokenized<contents:This is a test: Linux> stored,indexed,tokenized<contents:This is a test: Windows>>

Я пытался использовать field0201.setBoost(), но это изменит порядок результатов поиска при поиске Linux или Windows.

1 Ответ

4 голосов
/ 14 апреля 2011

Я думаю, это будет возможно, если вы поместите свои данные для разных источников в поля с разными именами. Вы можете установить повышение в индексное время, но если вы используете одно и то же имя, я думаю, что повышение будет применяться ко всем полям с одинаковым именем - на основе setBoost javadoc . Так что если вы сделаете это вместо:

val field0201 = new Field("content-high", "This is a test: Linux", ...)
field0201.setBoost(1.5f)
val field0202 = new Field("content-low", "This is a test: Windows", ...)

И затем запрос с помощью content-high:Linux content-low:Linux (используя логический запрос с двумя должен пункт, оба установлены на термин Linux ), затем повышение для content-high должен увеличить оценку документа, если совпадение находится в этом поле. Используйте explain, чтобы увидеть, работает ли это.

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