sanchezzzhak
@sanchezzzhak
Ля ля ля...

SphinxQL как можно повысить качество поиска в 1-2х символьных значениях.?

Пользователь вводит в поле samsung note
ему выдается список из списка 7 возможных устройств.

Как заставить его индексировать вот такие штуки Samsung note 10.1 n8020
По запросу Samsung note 10. находит, но если сделать запрос по Samsung note 10.1 то выдаст результат 0

ps использую в запросах звездочки, может поэтому?

Конфиг
source dev_mobile :dev_config {
	sql_query = \
		SELECT * FROM mobiles
		
	sql_field_string = vendor
	sql_field_string = name
	
}

index dev_mobile 
{

   source			= dev_mobile
   path			= /var/lib/sphinx/data/dev_mobile

       charset_table   = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
	min_word_len      = 1
	html_strip        = 1
	min_infix_len     = 3
	index_exact_words = 1
	blend_chars = &,U+23
	
	morphology      = lemmatize_en
	#morphology		= stem_en
	#morphology		= stem_enru, soundex, metaphone
}


Запрос SphinxQL в php у меня в виде метода в модели (yii1.5)
/**
     * Поиск устройства
     * @param $query
     * @param int $offset
     * @param int $limit
     * @return array|null
     */
    public function searchSphinx($query , $offset = 0, $limit = 30)
    {
        /**
         * @var CDbConnection $sphinx
         */
        $sphinx = Yii::app()->sphinx;

        $sql = "SELECT id, weight() FROM  dev_mobile WHERE MATCH(".$sphinx->quoteValue('@(name,vendor) '.$query.'*').")";
        $sql.= " LIMIT $offset,$limit ";
        $sql.= " OPTION field_weights=(name=10,vendor=11), max_matches=10000, ranker=expr('sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25');";

        $result = $sphinx->createCommand($sql)->queryAll();

        $ids = array_map(function($element){return $element['id'];}, $result);

        $arr_info   = $sphinx->createCommand('show meta')->queryAll();
        $data_info = array();
        foreach($arr_info as $info)
        {
            $data_info[ $info['Variable_name']  ] = $info['Value'];
        }
        if(! count($ids)) return null;

        $criteria = new CDbCriteria;
        $criteria->condition = 't.id IN('.implode(',',$ids).')';
        $criteria->order = 'FIELD(t.id, '.implode(',',$ids).')';

        return array(
            'data' => self::model()->with('system')->findAll($criteria),
            'info' => $data_info
        );
    }
  • Вопрос задан
  • 2757 просмотров
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
у вас точки не в индексируемых символах, а вы их зачем то ищите.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы