Elastic search模糊匹配,精确匹配显示在前

我想在查询上使用模糊匹配,但在结果顶部显示完全匹配。

我已经尝试了以下方法。

$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部分构造匹配项。

以上是 Elastic search模糊匹配,精确匹配显示在前 的全部内容, 来源链接: utcz.com/qa/434281.html

回到顶部