【发布时间】:2016-05-15 01:22:36
【问题描述】:
下面给出的是我使用 elasticsearch 生成索引的代码。索引生成成功。基本上我使用它来根据电影名称、演员名称和类型生成自动建议。
现在我的要求是,我需要将子字符串与特定字段匹配。如果我使用$params['body']['query']['wildcard']['field'] = '*sub_word*';,这可以正常工作。(即搜索“to”给出“tom kruz”但搜索“tom kr”不返回结果)。
这仅匹配字符串中的特定单词。我想匹配包含多个单词的子字符串(即'tom kr'应该返回'tom kruz')。
我发现很少有文档,说可以使用“ngram”。 但我不知道,我应该如何在我的代码中实现它,因为我使用基于数组的配置进行弹性搜索,并且所有支持文档都提到了 json fromat 中的配置。
请帮忙。
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);
}
【问题讨论】:
标签: php elasticsearch elastica