以下は、elasticsearch.Indexを使用してインデックスを生成するコードです。実際には、映画名、俳優名、および世代に応じて自動生成するために使用しています。Elasticsearchの一致部分文字列
$params['body']['query']['wildcard']['field'] = '*sub_word*';
を使用すると、部分文字列を特定のフィールドと一致させる必要があります(つまり、 'to'を検索すると 'tom kruz'が表示されますが、 'tom kr' 。
これはstring内の特定の単語にのみ一致します。複数の単語を含む部分文字列に一致させたい(つまり、 '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);
}
貴重なコスタですが、回答ありがとうございます。しかし、単なるクエリですが、個々の単語のワイルドカード検索を実行すると、複数のサブ文字列に一致する最も関連性の高い結果が得られますか? –