What I had in mind was creating a persisted computed column and just casting the json to text, like this:
create table r(j json, t as j persisted text, fulltext(t));
insert r values('["red","white","blue"]');
insert r values('["green","red"]');
optimize table r full; /* do this or wait long enough for flusher to update fulltext index */
select * from r where match(t) against('blue');
+------------------------+------------------------+
| j | t |
+------------------------+------------------------+
| ["red","white","blue"] | ["red","white","blue"] |
+------------------------+------------------------+
singlestore> select * from r where match(t) against('red');
+------------------------+------------------------+
| j | t |
+------------------------+------------------------+
| ["red","white","blue"] | ["red","white","blue"] |
| ["green","red"] | ["green","red"] |
+------------------------+------------------------+
If your text has blanks then you may need to convert them to underscores or something.
You might have to write an expression in the computed column definition to do that.
Another way to handle this is to normalize your lists into another table and join on the primary key of the original table, and put an index on the other table property value column. It’s most efficient to use an int or bigint surrogate key. E.g.,
create table s(id bigint, d datetime, shard(id));
create table s_set(s_id bigint, value text, shard(s_id), key(value));
singlestore> insert s values(1,now());
Query OK, 1 row affected (0.22 sec)
singlestore> insert s values(2,now());
Query OK, 1 row affected (0.00 sec)
singlestore> insert s_set values(1,"red");
Query OK, 1 row affected (0.21 sec)
singlestore> insert s_set values(1,"green");
Query OK, 1 row affected (0.00 sec)
singlestore> select * from s join s_set on s.id = s_set.s_id where s_set.value = "green";
+------+---------------------+------+-------+
| id | d | s_id | value |
+------+---------------------+------+-------+
| 1 | 2023-10-18 22:50:43 | 1 | green |
+------+---------------------+------+-------+
If you need to reconstruct the sets you can join the found IDs back to s_set.