戯言

つらつらと気づいたことを書いていきます。人狼とか。

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

solrの管理画面から複数のデータの登録や更新を行う



solrでは、updateコマンドを発行しなくとも、管理画面から登録や更新することもできます。

コアを選択後、Documentsのリンクを開きます。



1つのデータを登録するだけであれば、
Document Typeで「JSON」を選択し、
Document(s)に、

{"id":"change.me","title":"change.me"}

などと入力すれば、登録できます。

実は、「Document(s)」と複数データも行けるように見えますが、
Document Type 「JSON」では単一ドキュメントしか登録できません。
複数のデータをまとめて登録しようとして、

[
{"id":"change1.me","title":"change1.me"},
{"id":"change2.me","title":"change2.me"}
]

などと入力しても、エラーが発生します。

他にもいろいろ試してみましたが、できませんでした。


では、複数のデータを登録するにはどうするのでしょうか。
Document Type 「Solr Command (raws XML or JSON)」から、登録できることを確認しました。
Document(s)欄には、デフォルトでXMLの例文が表示されますが、(JSONで記述したいので)さくっと全て削除してしまって、

{
"add":{"doc":{"id":"change1.me","title":"change1.me"}},
"add":{"doc":{"id":"change2.me","title":"change2.me"}},
"commit":{}
}

とすると、登録(コミットも)できます。

どうやら、Document Type「JSON」の方は、入力したデータをもとに

{"add":{ "doc": (Document(s)欄に入力した値),
"commitWithin": (Commit Within欄に入力した値),
"overwrite": (overwrite欄に入力した値),
"boost": (Boost欄に入力した値)
}
}

のように補完しているんだと思います。

なので、複数のデータはDocument Type 「JSON」で登録できないのでしょう。たぶん。(ソースは見てない)


スポンサーサイト

dc.jsの使い方01 とりあえずグラフを表示する



グラフを表示するJavascriptのライブラリをいくつか使ってみた中で、
機能も豊富で、初見でのインパクトが強かった dc.js について、
わかる範囲で使い方を紹介していきます。

dc.jsで、とりあえずグラフを表示するコードは、こんな感じになります。
これをベースに、さまざまな変更、追加をしながら、説明していこうと思います。

<html>
<head>
<link rel="stylesheet" type="text/css" href="js/dc.css"/>
<script type="text/javascript" src="js/d3.js"></script>
<script type="text/javascript" src="js/crossfilter.js"></script>
<script type="text/javascript" src="js/dc.js"></script>
</head>
<body>
<div id="chart1"></div>

<script type="text/javascript">
data = [
		{"x":1, "y":5}
		,{"x":2, "y":8}
		,{"x":3, "y":6}
		,{"x":4, "y":1}
		,{"x":5, "y":7}
	];

	var cf = crossfilter(data);

	var xx = cf.dimension(function(d) { return d.x; });

	var yy = xx.group().reduceSum(function(d){ return d.y; });

	var graph = dc.lineChart("#chart1")
	.dimension(xx)
	.group(yy)
	.x(d3.scale.linear().domain([0, 6]))
	.render();
</script>
</body>
</html>

dcjs01.png
3行:デフォルトで用意されているcssを読み込みます。
4~6行:dc.jsと、dc.jsが利用しているcrossfilter、d3、これら3つの読み込みは必須です。

20行:グラフ用のデータをcrossfilter形式にします。crossfilterはデータをグループ化や集計、フィルリングなどできるライブラリで、dc.jsではcrossfilter形式でデータを扱います。

22行:x軸の定義です。JSONデータの各xの値を取り出しています。

24行:y軸の定義です。group()とreduceSum()という関数が出てきていますが、これの説明は後述しますが、各yの値を取り出しているのは伝わるかと思います。

26~30行:描画します。x軸、y軸に先ほどの定義を設定し、x軸を0から6の範囲とし、描画しています。

最低限グラフを書くのに必要なコードはこんな感じになります。

どうでしょうか。短いコードでさくっと書けると感じませんか?
まあ、細かい部分を弄ろうとすると、結構ハマるのですが…。

グラフの種類の変更


26行目の lineChart を barChart に変えると、こうなります。

dcjs02.png
グラフの種類の変更は、1か所変えるだけです。
ですが、グラフの種類ごとに、用意されている関数が異なるので、例えば線グラフ専用の関数を棒グラフで使うようなことはできません。dimension()、group()、x() は、両グラフで共通なので、問題なく利用できています。

他にもさまざまなグラフが用意されているので、公式のサンプルを見てみてください。


グルーピング


先ほどのグラフのy軸の定義で、group()が出てきました。これを説明します。
まず、このgroup()はdc.jsでなく、crossfilterの機能です。名前のとおりグルーピングをします。
ここでいうグルーピングとは、dimension()が同じデータを同一グループとして扱うという意味です。
上の例では、dimension()の返り値はd.xなので、x値が同じデータを同一グループとして扱います。
x値が全て異なる値だったので、グルーピングの影響がなく、わかりづらくなっていますが、
例えば、次のようにデータを一つ追加するとわかりやすくなります。
data = [
		{"x":1, "y":5}
		,{"x":2, "y":8}
		,{"x":3, "y":6}
		,{"x":4, "y":1}
		,{"x":5, "y":7}
		,{"x":5, "y":3}  // 追加
	];
追加したデータのxの値は1つ前のデータと同じ5です。
これでグラフを書くとこうなります。

dcjs03.png
まず、22行目の定義では、x値を返り値としています。
なので、x値が同じである5番目,6番目は同じ値を返します。
で、24行目のy軸の定義で、groupされるので、5という同じ値である5,6行目のデータは同一グループとして扱われます。

その同一グループのデータをどうするかというと、reduceSum()しています。
sumという名前のとおり合計します。
合計に使う中身の値は、d.yですね。なので、ここでは7と3を合計することになります。

グルーピングした結果をどうするか


reduceSum()ではグルーピングした値で合計値を求めましたが、他にも要素数を求めるreduceCount()などがあります。

24行目を次のようにすると、グラフはこうなります。

var yy = xx.group().reduceCount();

dcjs04.png
単純なグラフであればこれで充分ですが、reduce()を使えば任意の計算式を関数を定義できます。
例えば、平均値のグラフを書くような場合は、reduce()を使って平均値を計算する関数を定義する必要があります。



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。