Skip to content

Instantly share code, notes, and snippets.

@ise
Last active December 22, 2015 17:59
Show Gist options
  • Save ise/6509874 to your computer and use it in GitHub Desktop.
Save ise/6509874 to your computer and use it in GitHub Desktop.
Elasticaを使って検索するサンプル
<?php
require_once '../vendor/autoload.php';
use Elastica\Client;
use Elastica\Bulk;
use Elastica\Query;
use Elastica\Query\MatchAll;
use Elastica\Query\Term;
use Elastica\Query\QueryString;
use Elastica\Query\Bool;
use Elastica\Query\Range;
use Elastica\Query\MoreLikeThis;
$client = new Client();
$index = $client->getIndex('natalie_data');
$type = $index->getType('comic_news');
echo '/* 全件取得 */' . "\n";
$query = Query::create(new MatchAll());
//ソート条件を指定
$query->setSort(array('updated' => 'asc'));
//offset、取得件数を指定
$query->setFrom(0);
$query->setSize(15);
$resultSet = $type->search($query);
echo 'Total: ' . $resultSet->getTotalHits() . "\n";//総件数
echo 'Results: ' . count($resultSet) . "\n";//取得件数
foreach ($resultSet as $res) {
$d = $res->getData();//結果を配列形式で取得
//var_dump($d);
}
echo '/* 完全一致検索 */' . "\n";
// index => not_analyzed を指定したfieldに対してTermで検索する
$term = new Term();
$term->setTerm('link', 'http://natalie.mu/comic/news/98105');
$query = Query::create($term);
$resultSet = $type->search($query);
echo 'Total: ' . $resultSet->getTotalHits() . "\n";//総件数
echo 'Results: ' . count($resultSet) . "\n";//取得件数
foreach ($resultSet as $res) {
$d = $res->getData();
//var_dump($d);
}
echo '/* OR検索 */' . "\n";
$qs = new QueryString();
$qs->setQuery('荒木飛呂彦 江口寿史');
$qs->setDefaultField('summary');
//$qs->setDefaultOperator('AND');
$query = Query::create($qs);
//マッチ箇所のハイライト設定
$query->setHighlight(array(
'fields' => array(
'summary' => array(
'fragment_size' => 200,
'number_of_fragments' => 1,
),
),
));
$resultSet = $type->search($query);
echo 'Total: ' . $resultSet->getTotalHits() . "\n";//総件数
echo 'Results: ' . count($resultSet) . "\n";//取得件数
foreach ($resultSet as $res) {
$d = $res->getData();
$hl = $res->getHighlights();//ハイライト部分の取得
//var_dump($d);
//var_dump($hl);
}
echo '/* 複数条件での検索 */' . "\n";
// 8/27-8/28の記事で "マンガ" にマッチする記事
$b = new Bool();
$term = new Term();
$term->setTerm('summary', 'マンガ');
$b->addMust($term);
$range = new Range();
$range->addField('updated', array('from' => '2013-08-27', 'to' => '2013-08-28'));
$b->addMust($range);
$query = Query::create($b);
$resultSet = $type->search($query);
echo 'Total: ' . $resultSet->getTotalHits() . "\n";//総件数
echo 'Results: ' . count($resultSet) . "\n";//取得件数
foreach ($resultSet as $res) {
$d = $res->getData();
//var_dump($d);
}
echo '/* 類似文(関連記事)検索 */' . "\n";
$likeText = '『進撃の巨人』(しんげきのきょじん、Attack on Titan)は、諫山創による日本の漫画作品。小説・テレビアニメなどのメディアミックス展開が行われている。';
$mlt = new MoreLikeThis();
$mlt->setLikeText($likeText);
$mlt->setFields(array('title','summary'));
$mlt->setMaxQueryTerms(1);
$mlt->setMinDocFrequency(1);
$mlt->setMinTermFrequency(1);
$query = Query::create($mlt);
$resultSet = $type->search($query);
echo 'Total: ' . $resultSet->getTotalHits() . "\n";//総件数
echo 'Results: ' . count($resultSet) . "\n";//取得件数
foreach ($resultSet as $res) {
$d = $res->getData();
var_dump($d);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment