現在、Solr ベースのアプリケーションを Elasticsearch に移行しようとしています。
次の Lucene クエリがあります:
((
name:(+foo +bar)
OR info:(+foo +bar)
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
私の理解する限り、これはmust
ブール値と組み合わせた句の組み合わせですOR
。
を含むすべてのドキュメントを取得します
(foo AND bar in name) OR (foo AND bar in info)
。その後、条件で結果をフィルタリングしstate=1
、画像を含むドキュメントをブーストします。
bool クエリを使用しようとしましたが、ブール値を句にmust
取り込むことができません。次のようになります。OR
must
GET /test/object/_search
{
"from": 0,
"size": 20,
"sort": {
"_score": "desc"
},
"query": {
"bool": {
"must": [
{
"match": {
"name": "foo"
}
},
{
"match": {
"name": "bar"
}
}
],
"must_not": [],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
}
}
ご覧のとおり、must
の条件がinfo
欠落しています。
** アップデート **
elasticsearch クエリを更新し、その関数スコアを削除しました。基本的な問題はまだ残っています。
ベストアンサー1
- ORは次のように綴られるべきである
- ANDはmustと綴られる
- NORはmust_notと綴られる
例:
(丸くて(赤または青))に該当するすべてのアイテムを表示します。
{
"query": {
"bool": {
"must": [
{
"term": {"shape": "round"}
},
{
"bool": {
"should": [
{"term": {"color": "red"}},
{"term": {"color": "blue"}}
]
}
}
]
}
}
}
OR のより複雑なバージョンも実行できます。たとえば、5 つのうち少なくとも 3 つを一致させたい場合は、「should」の下に 5 つのオプションを指定し、「minimum_should」を 3 に設定できます。
以前の私の巣作りがうまくいかなかった部分を見つけてくれた Glen Thompson と Sebastialonso に感謝します。
ElasticSearch バージョン 6 では「term」が「match」になることを指摘してくれた Fatmajk にも感謝します。