我最终没有使用模糊匹配来解决我的问题,而是使用了ngram。
public function map(){ $params['index'] = self::INDEX; $params['body']['settings'] = array( 'index' => array( 'analysis' => array( 'analyzer' => array( 'product_analyzer' => array( 'type' => 'custom', 'tokenizer' => 'whitespace', 'filter' => array('lowercase', 'product_ngram'), ), ), 'filter' => array( 'product_ngram' => array( 'type' => 'nGram', 'min_gram' => 3, 'max_gram' => 5, ), ) ), ) ); //all the beans $mapping = array( '_source' => array( 'enabled' => true ), 'properties' => array( 'id' => array( 'type' => 'string', ), 'name' => array( 'type' => 'string', 'analyzer' => 'product_analyzer', 'boost' => '10', ), 'brand' => array( 'type' => 'string', 'analyzer' => 'product_analyzer', 'boost' => '5', ), 'description' => array( 'type' => 'string', ), 'barpres' => array( 'type' => 'string' ), ), ); $params['body']['mappings'][self::TYPE] = $mapping; $this->_client->indices()->create($params);}public function search($query){ $return = $this->_client->search( array( 'index' => self::INDEX, 'type' => self::TYPE, 'body' => array( 'query' => array( 'multi_match' => array( 'query' => $query, 'fields' => array('id', 'name', 'brand', 'description', 'barpres'), ), ), 'size' => '5000', ), ) ); $productIds = array(); if (!empty($return['hits']['hits'])) { foreach ($return['hits']['hits'] as $hit) { $productIds[] = $hit['_id']; } } return $productIds;}结果正是我想要的。它根据搜索查询中包含的ngram部分构造匹配项。



