Thinking Sphinx - поиск по шаблону только по определенным индексам - PullRequest
0 голосов
/ 06 декабря 2011

Я использую think-sphinx 2.0.10 в моей среде Rails 3.1, и индексация и поиск работают довольно хорошо.При поиске по моей модели User я хочу выполнить поиск по имени пользователя, но не по электронной почте, поэтому пользователя следует возвращать только в том случае, если заданная строка поиска точно соответствует электронной почте пользователя.Я провел некоторое исследование и выяснил, что это можно сделать, включив поиск по шаблону в блоке define_index с помощью

set_property :enable_star => true
set_property :min_infix_len => 1

и добавив :infixes => true к индексам, которые должны поддерживать поиск по шаблону

define_index do

  indexes "CONCAT(first_name, ' ', last_name)", :as => :user_name,  :infixes => true
  indexes email

    has :id, :as => :user_id
    
    set_property :enable_star => true
    set_property :min_infix_len => 1
end

Это из автоматически сгенерированного файла development.sphinx.conf

index user_core
{
  source = user_core_0
  path = /../../../../db/sphinx/development/user_core
  charset_type = utf-8
  min_infix_len = 1
  infix_fields = user_name
  enable_star = 1
}

Правильно объявлено infix_fields.

Проблема в том, что если я ищу ".com"Я все еще получаю всех пользователей с адресом электронной почты .com. В чем может быть причина?

Спасибо за вашу помощь!

1 Ответ

3 голосов
/ 06 декабря 2011

Сфинкс индексирует слова во входных данных.Обычно только целые слова, но могут включать части слова с инфиксом / префиксом.

В любом случае, все, что не определено в charset_table (у вас его нет по умолчанию), является разделителем.

Так что "."это разделитель.Таким образом, ваша электронная почта будет проиндексирована в виде слов.«ком» это слово само по себе.

Таким образом, поиск «.com» - это просто поиск «com», то есть совпадение всего слова.

Вы можете просто добавить "."к вашей таблице кодировки, чтобы решить эту проблему.(но будьте осторожны, если он используется в качестве разделителя в ваших данных. Если просто индексировать имя и адрес электронной почты, может не быть проблемой).Возможно, тоже стоит добавить @, чтобы все письма можно было проиндексировать как одно «слово».


Я не знаю, как поместить это в ваш ruby ​​config, я просто знаю, что он должен оказаться в файле sphinx conf

...