Hatena::ブログ(Diary)

作業記録/備忘録(仮) このページをアンテナに追加 RSSフィード

2015/01/21

CAN通信させてみた(BeagleBoneBlack-RaspberryPi 間) - その1(1/3)

概要

BeagleBoneBlackとRaspberryPiの間でCANを利用した簡易通信実験ができるようになるまでに必要な情報をまとめた。
ほぼ先人の情報を参考にしてできたので、内容的には、その際に使用した参考にしたサイトを中心に紹介し、自分で実際にやってみて、間違えたところやうまくいかなかったところ、気づいた点などの情報を追記する形式とした。
初回は、CANのプロトコル仕様について。

背景

モータードライバをCANでコントロールする必要に迫られ、とりあえずCANってどういう仕様?というお勉強から、具体的に動かすために何が必要か(エレキ、ソフトウェア)の調査、実際に作ってみて・buildして実験まではできたので、それをまとめてみることにした。

環境

PC: Ubuntu14.04 64bit (RasPi kernelのクロスコンパイル用)

仮想系。母艦はMacBookProのVirtualBoxWindows8.1のVMwarePlayer

ロジックアナライザ: LogicCube(LAP-C16032)

StrawberryLinuxや秋月などで10k-12kほどで買えます。マルツでも買えるけどプローブが2個しかついてないみたい。
(マルツの方が安いのでプローブ持ってる人/使わない人は、そちらでいいかも)

リンク

まずは、CANの仕様について以下のサイトでお勉強してみた。
序章含めて全7回分あり、以下の4回を中心に読み進めた。

上記サイトから、CANの特徴を表し重要と感じたキーワードをピックアップすると以下。
使う分には、ざっくりと以下の意味と背景を知り、トラブルが発生した時にキーワードが思い出せれば最初の段階としてはいいのではなかろうか。(と勝手に思ってる)

感想としては、基本的には、IDとデータがあれば通信できると理解。
それをうまく動かす工夫として、ドミナントの意味と背景、ビットスタッフィングルールとエラー処理あたりがよく考えられてるなぁと感じた。
2線式だが低速の時は、1本切れても通信できたりも。

次回は、RasPi側のCANエレキ、ソフトの準備などについて記載予定。徐々にまとめる予定。

2012/11/15

文字列のフォーマット format() を使ってみたメモ

//編集中 2012/12/05 追記
//formatで変数の展開、kw,list,辞書,変数を*で展開、**で展開、について触れる。
//第6回 Pythonicな文字列フォーマットforamat()メソッド http://gihyo.jp/dev/serial/01/pythonhacks/0006


文字列出力のpythonicな方法
これまでは、C-likeな使い方。「print "%d %s" % (10, "hoge")」 みたいな。
%演算子を使うに当たってPython以外の知識を覚えなければならない。
辞書のキーを指定した埋め込みではまったく違う表記を使うなど,アドホックな仕様もあった。

format()は、python記法に近い方法で、C由来の方法を置きかえる目的で追加された。
PEP 3101 -- Advanced String Formattingとして記載(ver.2.6で追加された)
なので、%記法は近い将来廃止予定(非推奨)
一応3.2ではsupportはまだされている。

#! /usr/bin/env python                                                                                                                                                          
# -*- coding: utf-8 -*-                                                                                                                                                         

#--------------------------------------                                                                                                                                         
# これまでのやりかた(Cのやりかたを踏襲)                                                                                                                                         
#--------------------------------------                                                                                                                                         
# タプル渡し                                                                                                                                                                    
print "%d %d %s" % (1, 3, "unpopo")

# 辞書渡し                                                                                                                                                                      
hoge="HOGE"
print "%(hoge)s" % locals()
print "%(fuga)s" % {"fuga":"FUGA"}

#exit()                                                                                                                                                                         
#---------------------                                                                                                                                                          
# formatを使ったやり方                                                                                                                                                          
#---------------------                                                                                                                                                          
# formatとは、文字列のmethodでこんな感じで使える。                                                                                                                              
print "{0} {1} {2}".format("unpopo", 12345, "popopo-")

# <基礎編>                                                                                                                                                                      
# (1-1)リスト渡し: {N}(Nは整数,0オリジン)でformatの要素を表示する                                                                                                               
# Index指定で、要素の順番を入れ替えられる                                                                                                                                       
fmt_list1 = "list-1 {0} {1} {2} {3}"
ret = fmt_list1.format( 0, 10, 20, 30 )
print ret

fmt_list2 = "list-2 {0} {3} {1} {2}"
ret = fmt_list2.format( 0, 10, 20, 30 )
print ret

# *を指定するとリスト展開後の要素にアクセスできる(他の関数と同様)                                                                                                               
l1  = [0, 10, 20, 30]
ret = fmt_list2.format(*l1)
print ret

# {N[key]}で辞書の要素にアクセスできる                                                                                                                                          
d1 = {'x':"xxx", 'y':"yyy"}
fmt_list3 = "list-3 {0[x]} {0[y]}"
ret = fmt_list3.format( d1 )
print ret



print "------------"
#exit()                                                                                                                                                                         
# (1-2)K/W渡し: {key} でformatに渡したキーワードを展開して表示する                                                                                                              

fmt_dict1 = "dict-1 {hoge} {moge} {hoge}"
ret = fmt_dict1.format( hoge="hogehoge", moge=12345 )
print ret

# {key[key]}で辞書の要素にアクセスできる                                                                                                                                        
d2 = {'a':"aaa", 'b':"bbb"}
fmt_dict2 = "dict-2 {hoge[a]} {hoge[b]}"
ret = fmt_dict2.format( hoge=d2 )
print ret

# **を指定するとK/W展開後の要素にアクセスできる(他の関数と同様)                                                                                                                 
fmt_dict3 = "dict-3 {a} {b}"
ret = fmt_dict3.format( **d2 )
print ret

#exit()                                                                                                                                                                         
print "------------"
# (1-3)オブジェクト渡し: クラスオブジェクトや、モジュールを渡して、                                                                                                             
#                      "."で指定して要素にアクセスさせる                                                                                                                        
class Unpopo(object):
    def __init__(self, l, m, n):
        self.l = l
        self.m = m
        self.n = n
u1 = Unpopo("abc",123,"xyz")
fmt_obj1 = "{0.l} {0.m} {0.n}"
ret = fmt_obj1.format( u1 )
print ret

fmt_obj2 = "{unpopo.l} {unpopo.m} {unpopo.n}"
ret = fmt_obj2.format( unpopo=u1 )
print ret


fmt_obj3 = "python version: {0.version}"
import sys
ret = fmt_obj3.format( sys )
print ret

print "------------"
# (2-1) フォーマットコントロール                                                                                                                                                
# 領域と、幅寄せ                                                                                                                                                                
print "{0:10} {1} {2:>20}".format("hogehoge","|","fugafuga")

# 他にもいろいろアルがそれはmanual参照                      

2012/08/31

エキスパートPythonプログラミング(1) イテレータ、ジェネレータ、ジェネレータ式

「エキスパートPythonプログラミング」の中からピックアップした話題をベースに、python user3人で勉強会(2012/08/31)しました。
その際の資料を元に、勉強会で話した内容を公開しておきます。

テーマ/キーワード

iterator、generator、generator式

以下は、話の流れで少し触れた程度
関数オブジェクト
- 有名
- 無名
closure

本日の概要

今日は、ジェネレータの話をします。

ジェネレータとは、「一旦何らかの値を戻して、しばらく後にその時点から処理を再開する」ことが出来る関数です。時間を置いて値をいくつも生成(generate)するところからそう呼ばれています。
ジェネレータは反復処理に使われるため、必ず「イテレータプロトコル」に対応します。

まず、イテレータのおさらいからします。

イテレータ

イテレータとは、単に"イテレータプロトコル"を実装したコンテナオブジェクトです。
イテレータプロトコル*1とは、次の2つのメソッドです。

  • コンテナの次の要素を返すnextメソッド(Python3系では、__next__に変更された)
  • イテレータ自身を返す__iter__メソッド

(実演) イテレータの基礎
イテレータを作ってループを回してみます。

$ python
>>> i = iter('12345')
>>> i # <iterator object at 0xXXXX>のようなイテレータオブジェクトが出来ているのが見えるはず
>>> i.next() # '1'
>>> i.next() # '2'
>>> i.next() # '3'
>>> i.next() # '4'
>>> i.next() # '5'
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 

  • シーケンスの要素を取り出し終わるとStopIterationが発生します。
  • forループは、StopIterationの例外を捕まえるとループを終了するようになっています。

"オレオレイテレータ"を作成するには、next()メソッド、__iter__を提供するようにします。

(実演) オレオレイテレータ
初期値を与え、1ずつカウントダウンするイテレータを作ってみます。

class CountDownIter(object):
	def __init__(self, num):
		self.num = num
	def __iter__(self):   # ★ in演算子などで利用可能にする
		return self
	def next(self):       # ★ loopなどでコンテナの次の値を取り出す
		self.num -= 1
		if self.num == 0:
			raise StopIteration
		return self.num


i1 = CountDownIter(5)
i1.next() # 4
i1.next() # 3
...

i2 = CountDownIter(5)
for i in i2:
 print i  


ジェネレータ

最初に話した通り、ジェネレータとは、「一旦何らかの値を戻して、しばらく後にその時点から処理を再開する」ことが出来る関数です。
"yieldステートメント"を含む関数が呼び出されたときには、イテレータプロトコルをサポートするジェネレータオブジェクトを戻します。
文字でみるより動きをみた方が早いと思うので実演でみてみます。

(実演) ジェネレータ
カウントダウンするジェネレータを作って、先のイテレータと比較してみます。

>>> def count_down_gen(num):
>>> 	while True:
>>> 		if num==0:
>>> 			raise StopIteration
>>> 		yield num
>>> 		num -= 1
>>>
>>> g1 = count_down_gen(5)
>>> g1 # <generator object <genexpr> at 0xXXXX>のようにジェネレータオブジェクトが作られているのが見えるはず
>>> g1.next() # 5
>>> g1.next() # 4
...
>>> g2 = count_down_gen(5)
>>> for g in g2:
>>>  print g

ジェネレータはイテレータの一種です。先のイテレータと同じようなことが出来ました。
さらにジェネレータでは、タダのイテレータではできない、無限数列なども実装できます。

def num_sequence(num):
	while True:
		yield num*2
		num += 1		


g3 = num_sequence(5)
print g3
g3.next()

〜本の解説より〜
開発者は長年、普通にリストを返す関数を利用することになれてきました。
ループ処理やシーケンスを返す関数を実装するときには、まずジェネレータの利用を検討すべきです。
一つずつ要素を返すことで、その要素を使用する他の関数へ渡す場合に全体のパフォーマンスを向上させます。

==>上記の例だと、無限に続く数列をリストで表現しようとすると、無限大なメモリサイズが必要になりますが、ジェネレータを使えば、解説のように"1要素と要素を生成する式"しか返さないのでメモリ効率が上がります。
(有限でも大きなリストを扱う場合には同じ話ですね)

標準ライブラリのtokenizeモジュールは、テキストストリームから1行ずつ取り出し、トークンを生成するイテレータを返します。
何らかの処理を行うコードに対して、トークンを一つずつ渡すことができます。

このように、ジェネレータでは処理を一時停止した時のステート情報を保持し、後で再開できるようにします。

ジェネレータ式

yieldを使う代わりに、丸括弧"()"を使ってもジェネレータ作ることができ、新たなジェネレータオブジェクトを生み出せます。
これをジェネレータ式といいます。
ジェネレータ式は単一の式の後ろに少なくとも一つの for 節と、場合によりさらに複数のfor または if 節を 続けたものです。
ジェネレータ式の使う変数の評価は、ジェネレータオブジェクトに対して next() メソッドを呼び出すまで遅延されます。
実演をみてもらうと、リストと比べると効率が良いことが分かるとおもいます。

(実演) ジェネレータ式

g4 = (x**2 for x in range(10) if x%2 == 0) # 0〜10の数字のうち偶数のものの2乗を返すgenerator objectを作る。
print g4
g4.next()

#リスト
l1 = [x**2 for x in range(10) if x%2 == 0]  # あらかじめ全部メモリ展開してしまう
print l1  # [0, 4, 16, 36, 64]

ジェネレータ式の目的は、主にメモリ使用量の最適化です。
実効速度はリスト内包表記より遅い場合があるので、実行結果の要素数が膨大になる場合のみにしたほうが良いそうです。

◆余談1 〜ジェネレータとジェネレータ式について〜

自分の理解では、有名のオブジェクトに対する無名のオブジェクトの関係みたいなものかなと思っています。
例えば、
関数」に対する「λ式」と同様に、
「ジェネレータ」に対する、「ジェネレータ式」
のように理解しています。
言葉で説明してもよく分からないと思うので、実例をみてみます。

(実例)
関数(有名関数)

def hoge(x):
 return x*10

ret = hoge(5)

□λ式(無名関数)

ret = (lambda x: x*10)(5)
#      ^^^^^^^^^^^^^^^^
#      --> "def hoge(x)" に相当

#※lambdaを有名な関数にするには以下のようにしてもOK
func1 = (lambda x: x*10)
ret = func1(5)

#※有名関数の関数オブジェクトも同様
func2 = hoge
ret = func2(5)

□ジェネレータ(有名ジェネレータ)

def fuga(max):    
 for e in range(max):
  yield e**2

g=fuga(10)
g.next()  

□ジェネレータ式(無名ジェネレータ(?))

max=10
g=(e**2 for e in range(max))
g.next()

◆余談2 〜状態を持つ〜

クロージャは関数が状態を持ったようなものですが、
ジェネレータもクロージャの一種です(多分)。

クラスインスタンスは状態を持てるので、ジェネレータもクロージャもクラスで表現できます。
ただ、クラスですべてすると冗長になるので、クロージャやジェネレータで省力化するのかなと思います。
(理解が間違ってるかもしれないので、乞うご意見)

◆余談3 〜便利なツールの紹介:itertools〜

itertoolsという、イテレータ(+ジェネレータ)の扱いを便利にするモジュールpythonにはあります。
これを使うとイテレータ同士の演算や、結合(chain)、分割(tee)、uniqしたり(groupby)など、いろいろできて実用上も便利です。
http://www.python.jp/doc/2.6/library/itertools.html

参考

  • 「エキスパート Python プログラミング」, Tarek Ziade 著, 稲田直哉,渋川よしき,清水川貴之,森本哲也 訳,ASCII
  • 「初めてのPython 第3版」,Mark Lutz 著,夏目 大 訳,O'REILLY


◆◆◆勉強会中のツッコミを反映しておきました◆◆◆
・イテレータ、ジェネレータはリストとの比較をしないほうが良いかもしれない。
==>"状態を持つリストのようなもの"という表現を削除しました。
・ジェネレータもクロージャでは?
==>多分そうなので、追記して置きました。

◆◆◆勉強会中に出た話題◆◆◆
・for文でリスト使えればイテレータいらなくね?というツッコミ
==>イテレータを使うメリットに2つありそう
- イテレータは抽象的な概念なのでnext()の実装を動的に変えることが出来るなど拡張性を高められる
- リストのように事前にすべて計算されていない場合にも対応できる(前述のオレオレイテレータの例を参照)

初めてのPython 第3版

初めてのPython 第3版

*1:ここで言うプロトコルは、通信などの"プロトコル"のイメージとは異なり"規約"くらいの意味です。語源は同じだけど。

2012/03/06

Solrで検索する

検索データの準備

チュートリアル(http://lucene.apache.org/solr/tutorial.html)に従い、下記2件のデータ(*.xml)をpost.jarを使いインポートしてみた。

$ java -jar exampledocs/post.jar exampledocs/solr.xml exampledocs/monitor.xml 
SimplePostTool: version 1.4
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: COMMITting Solr index changes..

全サンプルデータにIndexをつける

チュートリアルに従うと、以下のコマンドで、インデックスをすべてのサンプルデータにつけられる。
...ってあれ、さっきのインポートと同じじゃ...。

$ java -jar exampledocs/post.jar exampledocs/*.xml 
SimplePostTool: version 1.4
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file gb18030-example.xml
SimplePostTool: POSTing file hd.xml
SimplePostTool: POSTing file ipod_other.xml
SimplePostTool: POSTing file ipod_video.xml
SimplePostTool: POSTing file mem.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: POSTing file monitor2.xml
SimplePostTool: POSTing file mp500.xml
SimplePostTool: POSTing file sd500.xml
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file utf8-example.xml
SimplePostTool: POSTing file vidcard.xml
SimplePostTool: COMMITting Solr index changes..

検索してみる

"Make a Query"インタフェースを使って、管理画面(Admin screen)から検索してみる。
検索のテキストボックスに"solr"など入れてみて、"search"ボタンを押す。
すると、検索結果がxml形式で返る。この検索結果には、"solr"をキーワードとして含むエントリが返される。

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">solr</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<arr name="cat">
<str>software</str>
<str>search</str>
</arr>
<arr name="features">
<str>
Advanced Full-Text Search Capabilities using Lucene
</str>
<str>Optimized for High Volume Web Traffic</str>
<str>Standards Based Open Interfaces - XML and HTTP</str>
<str>Comprehensive HTML Administration Interfaces</str>
<str>
Scalability - Efficient Replication to other Solr Search Servers
</str>
<str>
Flexible and Adaptable with XML configuration and Schema
</str>
<str>
Good unicode support: h&#233;llo (hello with an accent over the e)
</str>
</arr>
<str name="id">SOLR1000</str>
<bool name="inStock">true</bool>
<date name="incubationdate_dt">2006-01-17T00:00:00Z</date>
<str name="manu">Apache Software Foundation</str>
<str name="name">Solr, the Enterprise Search Server</str>
<int name="popularity">10</int>
<float name="price">0.0</float>
</doc>
</result>
</response>

詳細検索条件を指定してみる

キーワードだけ指定して検索
  • 検索例
    • video
  • 検索結果
    • <str 〜></str>に、"video"が含まれるエントリである、idが"MA147LL/A", "EN7800GTX/2DHTV/256M", "100-435805"の3つが返ってきている。
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">video</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="3" start="0">
<doc>
<arr name="cat">
<str>electronics</str>
<str>music</str>
</arr>
<arr name="features">
<str>iTunes, Podcasts, Audiobooks</str>
<str>
Stores up to 15,000 songs, 25,000 photos, or 150 hours of video
</str>
<str>
2.5-inch, 320x240 color TFT LCD display with LED backlight
</str>
<str>Up to 20 hours of battery life</str>
<str>
Plays AAC, MP3, WAV, AIFF, Audible, Apple Lossless, H.264 video
</str>
<str>
Notes, Calendar, Phone book, Hold button, Date display, Photo wallet, Built-in games, JPEG photo playback, Upgradeable firmware, USB 2.0 compatibility, Playback speed control, Rechargeable capability, Battery level indication
</str>
</arr>
<str name="id">MA147LL/A</str>
<bool name="inStock">true</bool>
<str name="includes">earbud headphones, USB cable</str>
<str name="manu">Apple Computer Inc.</str>
<date name="manufacturedate_dt">2005-10-12T08:00:00Z</date>
<str name="name">Apple 60 GB iPod with Video Playback Black</str>
<int name="popularity">10</int>
<float name="price">399.0</float>
<str name="store">37.7752,-100.0232</str>
<float name="weight">5.5</float>
</doc>
<doc>
<arr name="cat">
<str>electronics</str>
<str>graphics card</str>
</arr>
<arr name="features">
<str>NVIDIA GeForce 7800 GTX GPU/VPU clocked at 486MHz</str>
<str>256MB GDDR3 Memory clocked at 1.35GHz</str>
<str>PCI Express x16</str>
<str>Dual DVI connectors, HDTV out, video input</str>
<str>OpenGL 2.0, DirectX 9.0</str>
</arr>
<str name="id">EN7800GTX/2DHTV/256M</str>
<bool name="inStock">false</bool>
<str name="manu">ASUS Computer Inc.</str>
<date name="manufacturedate_dt">2006-02-13T00:00:00Z</date>
<str name="name">ASUS Extreme N7800GTX/2DHTV (256 MB)</str>
<int name="popularity">7</int>
<float name="price">479.95</float>
<str name="store">40.7143,-74.006</str>
<float name="weight">16.0</float>
</doc>
<doc>
<arr name="cat">
<str>electronics</str>
<str>graphics card</str>
</arr>
<arr name="features">
<str>ATI RADEON X1900 GPU/VPU clocked at 650MHz</str>
<str>512MB GDDR3 SDRAM clocked at 1.55GHz</str>
<str>PCI Express x16</str>
<str>dual DVI, HDTV, svideo, composite out</str>
<str>OpenGL 2.0, DirectX 9.0</str>
</arr>
<str name="id">100-435805</str>
<bool name="inStock">false</bool>
<str name="manu">ATI Technologies</str>
<date name="manufacturedate_dt">2006-02-13T00:00:00Z</date>
<str name="name">ATI Radeon X1900 XTX 512 MB PCIE Video Card</str>
<int name="popularity">7</int>
<float name="price">649.99</float>
<str name="store">40.7143,-74.006</str>
<float name="weight">48.0</float>
</doc>
</result>
</response>

名前にキーワードが含まれるものだけ検索
  • 検索例
    • name:video
  • 検索結果
    • <str name=name>〜</str>に"video"が含まれるエントリである、idが"MA147LL/A"と、"100-435805"の2つが返ってきている。
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">name:video</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="2" start="0">
<doc>
<arr name="cat">
<str>electronics</str>
<str>music</str>
</arr>
<arr name="features">
<str>iTunes, Podcasts, Audiobooks</str>
<str>
Stores up to 15,000 songs, 25,000 photos, or 150 hours of video
</str>
<str>
2.5-inch, 320x240 color TFT LCD display with LED backlight
</str>
<str>Up to 20 hours of battery life</str>
<str>
Plays AAC, MP3, WAV, AIFF, Audible, Apple Lossless, H.264 video
</str>
<str>
Notes, Calendar, Phone book, Hold button, Date display, Photo wallet, Built-in games, JPEG photo playback, Upgradeable firmware, USB 2.0 compatibility, Playback speed control, Rechargeable capability, Battery level indication
</str>
</arr>
<str name="id">MA147LL/A</str>
<bool name="inStock">true</bool>
<str name="includes">earbud headphones, USB cable</str>
<str name="manu">Apple Computer Inc.</str>
<date name="manufacturedate_dt">2005-10-12T08:00:00Z</date>
<str name="name">Apple 60 GB iPod with Video Playback Black</str>
<int name="popularity">10</int>
<float name="price">399.0</float>
<str name="store">37.7752,-100.0232</str>
<float name="weight">5.5</float>
</doc>
<doc>
<arr name="cat">
<str>electronics</str>
<str>graphics card</str>
</arr>
<arr name="features">
<str>ATI RADEON X1900 GPU/VPU clocked at 650MHz</str>
<str>512MB GDDR3 SDRAM clocked at 1.55GHz</str>
<str>PCI Express x16</str>
<str>dual DVI, HDTV, svideo, composite out</str>
<str>OpenGL 2.0, DirectX 9.0</str>
</arr>
<str name="id">100-435805</str>
<bool name="inStock">false</bool>
<str name="manu">ATI Technologies</str>
<date name="manufacturedate_dt">2006-02-13T00:00:00Z</date>
<str name="name">ATI Radeon X1900 XTX 512 MB PCIE Video Card</str>
<int name="popularity">7</int>
<float name="price">649.99</float>
<str name="store">40.7143,-74.006</str>
<float name="weight">48.0</float>
</doc>
</result>
</response>

キーワードを含み、且つプロパティが特定条件のものだけ検索
  • 検索例
    • 以下の例では、"price"が"400"までのものを検索する
    • +video +price:[* TO 400]
  • 検索結果
    • <float name="price">〜</price>が400迄の物(399.0の物)だけ返ってきている。
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">+video +price:[* TO 400]</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<arr name="cat">
<str>electronics</str>
<str>music</str>
</arr>
<arr name="features">
<str>iTunes, Podcasts, Audiobooks</str>
<str>
Stores up to 15,000 songs, 25,000 photos, or 150 hours of video
</str>
<str>
2.5-inch, 320x240 color TFT LCD display with LED backlight
</str>
<str>Up to 20 hours of battery life</str>
<str>
Plays AAC, MP3, WAV, AIFF, Audible, Apple Lossless, H.264 video
</str>
<str>
Notes, Calendar, Phone book, Hold button, Date display, Photo wallet, Built-in games, JPEG photo playback, Upgradeable firmware, USB 2.0 compatibility, Playback speed control, Rechargeable capability, Battery level indication
</str>
</arr>
<str name="id">MA147LL/A</str>
<bool name="inStock">true</bool>
<str name="includes">earbud headphones, USB cable</str>
<str name="manu">Apple Computer Inc.</str>
<date name="manufacturedate_dt">2005-10-12T08:00:00Z</date>
<str name="name">Apple 60 GB iPod with Video Playback Black</str>
<int name="popularity">10</int>
<float name="price">399.0</float>
<str name="store">37.7752,-100.0232</str>
<float name="weight">5.5</float>
</doc>
</result>
</response>

検索クエリの文法

検索のクエリ文法は以下で確認できる。
http://wiki.apache.org/solr/SolrQuerySyntax