Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Sphinx организовать поиск по группам (straight\gay\shemale)?
цитата
08/09/16 в 10:57
 S_Flash
Как в базе десков организовать поиск с группировками типа
- только straight
- только для геев
- только shemale

Поиск для бОльших результатов и меньшей релевантности организован как SPH_MATCH_ANY, но надо сделать на поисковой форме переключатель в виде радиокнопки, который будет фильтровать результаты по гееям и не геям и т.п.

Т.е. в поиск надо будет встроить отрицания, типа для straight ко всем запросам добавив: {запрос} -gay -twink
Или наоборот, как-то придать для поиска по геям и шмелям обязательный весомый кейворд, коорый будет добавляться к запросу..

Тут возникает загвоздка, все эти прелесьти поиска не работают в SPH_MATCH_ANY. Так же в документации не рекомендуется злоупотреблять отрицанием, так как оно, вроде, сильно грузит поиск, если основной запрос короткий.
Есть идеи?
цитата
08/09/16 в 12:20
 lalex
Используй атрибуты.
цитата
08/09/16 в 12:53
 S_Flash
lalex писал:
Используй атрибуты.

Не совсем ясно, что может являться атрибутом и каковы критерия совпадения атрибута с массивом фильтра.
У меня поиск ведётся по тайтлам, которые являются sql_field_string в sphinx, отдельного атрибута\столбца, который разделял бы весь контент на теги\группы нет.
Т.е. надо как-то фильтровать по тому же полю или одному из полей, в котором(ых) и ведётся текстовый поиск.
цитата
09/09/16 в 00:39
 Sterx
3 индекса
загонять в нужный индекс через title like '%gay%'
либо пометить записи тегом-категорией
цитата
09/09/16 в 11:48
 S_Flash
Sterx писал:
3 индекса
загонять в нужный индекс через title like '%gay%'

Можно чуть больше инфы?
цитата
09/09/16 в 12:33
 Sterx
ну смотри вот мой конфиг с использованием поля orientation

source cjnet_search_straight
{
        type                                    = mysql

        sql_host                                = xxxxx
        sql_user                                = cjnet_search
        sql_pass                                = xxxxx
        sql_db                                  = cjnet_search
        sql_port                                = 3306  # optional, default is 3306
        sql_query                               = SELECT contentID, title, description, niches, tubeTitle, data, duration  FROM content WHERE status = 'active' AND orientation = 'straight'
        sql_attr_uint = data
        sql_attr_uint = duration
}


index cjnet_search_index_straight
{
        source                                  = cjnet_search_straight
        path                                    = /var/sphinx/cjnet_search_index_straight
        docinfo                                 = extern
        morphology                              = stem_en # or stem_ru for example
}

source cjnet_search_gay
{
        type                                    = mysql

        sql_host                                = чччччч
        sql_user                                = cjnet_search
        sql_pass                                = xxxxxxxxxx
        sql_db                                  = cjnet_search
        sql_port                                = 3306  # optional, default is 3306
        sql_query                               = SELECT contentID, title, description, niches, tubeTitle, data, duration  FROM content WHERE status = 'active' AND orientation = 'gay'
        sql_attr_uint = data
        sql_attr_uint = duration
}


index cjnet_search_index_gay
{
        source                                  = cjnet_search_gay
        path                                    = /var/sphinx/cjnet_search_index_gay
        docinfo                                 = extern
        morphology                              = stem_en # or stem_ru for example
}

source cjnet_search_shemale
{
        type                                    = mysql

        sql_host                                = xxxxx
        sql_user                                = cjnet_search
        sql_pass                                = xxxxx
        sql_db                                  = cjnet_search
        sql_port                                = 3306  # optional, default is 3306
        sql_query                               = SELECT contentID, title, description, niches, tubeTitle, data, duration  FROM content WHERE status = 'active' AND orientation = 'shemale'
        sql_attr_uint = data
        sql_attr_uint = duration
}


index cjnet_search_index_shemale
{
        source                                  = cjnet_search_shemale
        path                                    = /var/sphinx/cjnet_search_index_shemale
        docinfo                                 = extern
        morphology                              = stem_en # or stem_ru for example
}


поскольку флага orientation у тебя нет, его нужно либо создать (перебрав записи на наличие в title соответствующих кеев - те что не подойдут ни под gay ни под shemale идут автоматом как straight (например дефолтное значение orientation))
или
для помещения в нужный индекс сфинкса переделать запросы его конфига используя в выборках встроенные механизмы типа like или FULLTEXT search
вместо допоустим запроса в шмелином индексе
SELECT contentID, title, description, niches, tubeTitle, data, duration FROM content WHERE status = 'active' AND orientation = 'shemale'
использовать запрос
SELECT contentID, title, description, niches, tubeTitle, data, duration FROM content WHERE status = 'active' AND (title LIKE '%shemale%' OR title LIKE '%ladyboy%'
надо понимать что пиздец как неприятно мускулю, полнотекстовый не буду приводить - их в сети шквал примеров.
я бы все таки прописал признак orientation на твоем месте

и использование

            $this->sphinxIndexName = 'cjnet_search_index';
            if($this->routeValues->orientation != 'all'){$this->sphinxIndexName .= '_' . $this->routeValues->orientation;}


            $sphinx = new SphinxClient();
            $sphinx->SetServer(SPHINX_IP, SPHINX_PORT);
            $sphinx->SetMatchMode(SPH_MATCH_ANY);
            switch($this->routeValues->order){
                case 'data':
                    $sphinx->SetSortMode(SPH_SORT_ATTR_DESC,'data');
                break;
           
                case 'duration':
                    $sphinx->SetSortMode(SPH_SORT_ATTR_DESC,'duration');
                break;

                default:
                    $sphinx->SetSortMode(SPH_SORT_RELEVANCE);
                break;
            }
            if($this->redis->exists(NICHE . $this->sphinxQuery)){
                $sphinx->SetFieldWeights(array ('niches' => 20, 'title' => 10));
            }elseif($this->redis->exists(TUBE . $this->sphinxQuery)){
                $sphinx->SetFieldWeights(array ('tubeTitle' => 20, 'title' => 10));
            }else{
                $sphinx->SetFieldWeights(array ('niches' => 10, 'title' => 20));
            }
            $limit = $this->settings->searchMoviesPerPage;
            $offset = (($this->routeValues->page * $this->settings->searchMoviesPerPage) - $this->settings->searchMoviesPerPage);
            $sphinx->SetLimits($offset,$limit,($offset+$limit));
            $resultSphinx = $sphinx->Query($this->sphinxQuery, $this->sphinxIndexName);

как то так

или 1 индекс с атрибутами как выше писали


Эта страница в полной версии