我想在查询上使用模糊匹配,但在结果顶部显示完全匹配。
我已经尝试了以下方法。
$return = $this->_client->search( array( 'index' => self::INDEX, 'type' => self::TYPE, 'body' => array( 'query' => array( 'bool' => array( 'must' => array( 'multi_match' => array( 'query' => $query, 'fields' => array('name', 'brand', 'description'), 'boost' => 10, ), 'fuzzy_like_this' => array( 'like_text' => $query, 'fields' => array('name', 'brand', 'description'), 'fuzziness' => 1, ), ), ), ), 'size' => '5000', ), ) );
由于格式错误的查询错误,此方法不起作用。
有任何想法吗?
我最终没有使用模糊匹配来解决我的问题,而是使用了ngram。
/** * Map - Create a new index with property mapping */ 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', ), 'barcodes' => 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', 'barcodes'), ), ), 'size' => '5000', ), ) ); $productIds = array(); if (!empty($return['hits']['hits'])) { foreach ($return['hits']['hits'] as $hit) { $productIds[] = $hit['_id']; } } return $productIds; }
结果正是我想要的。它根据搜索查询中包含的ngram部分构造匹配项。