以下是我使用elasticsearch生成索引的代码。索引已成功生成。基本上,我使用它来根据电影名称、演员名称和类型生成自动建议。
现在我的要求是,我需要匹配特定字段中的子字符串。如果我使用
这只匹配字符串中的特定单词。我想匹配包含多个单词的子字符串(即“tom kr”应该返回“tom kruz”)。
我发现一些文档,说可以使用“ngram”。但我不知道如何在我的代码中实现它,因为我正在使用基于数组的elasticsearch配置,而所有支持的文档都提到了json格式的配置。
请帮忙。
现在我的要求是,我需要匹配特定字段中的子字符串。如果我使用
$params['body']['query']['wildcard']['field'] = '*sub_word*';
,这个方法可以正常工作(即搜索“to”会返回“tom kruz”,但搜索“tom kr”不会返回任何结果)。这只匹配字符串中的特定单词。我想匹配包含多个单词的子字符串(即“tom kr”应该返回“tom kruz”)。
我发现一些文档,说可以使用“ngram”。但我不知道如何在我的代码中实现它,因为我正在使用基于数组的elasticsearch配置,而所有支持的文档都提到了json格式的配置。
请帮忙。
require 'vendor/autoload.php';
$client = \Elasticsearch\ClientBuilder::create()
->setHosts(['http://localhost:9200'])->build();
/*************Index a document****************/
$params = ['body' => []];
$j = 1;
for ($i = 1; $i <= 100; $i++) {
$params['body'][] = [
'index' => [
'_index' => 'pvrmod',
'_type' => 'movie',
'_id' => $i
]
];
if ($i % 10 == 0)
$j++;
$params['body'][] = [
'title' => 'salaman khaan'.$j,
'desc' => 'salaman khaan description'.$j,
'gener' => 'movie gener'.$j,
'language' => 'movie language'.$j,
'year' => 'movie year'.$j,
'actor' => 'movie actor'.$j,
];
// Every 10 documents stop and send the bulk request
if ($i % 10 == 0) {
$responses = $client->bulk($params);
// erase the old bulk request
$params = ['body' => []];
unset($responses);
}
}
// Send the last batch if it exists
if (!empty($params['body'])) {
$responses = $client->bulk($params);
}