💬

Solrで配列型のフィールドに1つの値だけを持つデータを抽出する

2021/09/19に公開

Solrで配列型のフィールドに1つの値だけを持つデータを抽出する方法になります。

ただし前提は配列型のフィールドが数値型の場合のみを今回は想定しています。
文字列型の方法は分かっていないためご存知の方は教えてください。

具体的な抽出について

以下のデータがSolrに登録されている前提です。
この時numbersフィールドは配列型になっています。

name numbers
taro 1,2
hanako 1,4
ichiro 1
shohei 2,3,4
saori 2

このような状況で、numbersに2の値のみもつデータを抽出したい場合の方法が今回の記事の内容になります。

具体的には{"name": "saori", "numbers": ["2"]}のデータのみを取得したいです。

抽出方法

まずは全データを確認します。

$ curl 'http://localhost:8983/solr/my_core/query?q=*:*'
{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"*:*"}},
  "response":{"numFound":5,"start":0,"numFoundExact":true,"docs":[
      {
        "name":"taro",
        "numbers":["1","2"],
        "id":"122f67a2-fc07-4ebe-800e-57f7c6d8c192",
        "_version_":1711308323262824448},
      {
        "name":"hanako",
        "numbers":["1","4"],
        "id":"8a7f39c7-bb67-403c-99be-f9d559de91f3",
        "_version_":1711308323265970176},
      {
        "name":"ichiro",
        "numbers":["1"],
        "id":"ddafb03c-7b62-4d3f-a28a-c6473cc7f013",
        "_version_":1711308323267018752},
      {
        "name":"shohei",
        "numbers":["2","3","4"],
        "id":"7afe643f-bf90-4d71-bebf-e8a203de465f",
        "_version_":1711308323269115904},
      {
        "name":"saori",
        "numbers":["2"],
        "id":"e65b9dc7-ad7c-49f0-9e37-1d08023a8fe4",
        "_version_":1711308323270164480}]
  }}

抽出してみる

$ curl -g 'http://localhost:8983/solr/my_core/query?q=numbers:2+AND+NOT+numbers:{2+TO+*}+AND+NOT+numbers:{*+TO+2}'  
{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"numbers:2 AND NOT numbers:{2 TO *} AND NOT numbers:{* TO 2}"}},
  "response":{"numFound":1,"start":0,"numFoundExact":true,"docs":[
      {
        "name":"saori",
        "numbers":["2"],
        "id":"e65b9dc7-ad7c-49f0-9e37-1d08023a8fe4",
        "_version_":1711308323270164480}]
  }}

はい。取得できました!

結論

以下のように Xに取得したい値を入力してあげれば該当の値のみを持つデータ取得可能となります。

q=numbers:X+AND+NOT+numbers:{X+TO+*}+AND+NOT+numbers:{*+TO+X}'

Discussion