Riak поиск по типам данных CRDT - серверная часть памяти - PullRequest
0 голосов
/ 30 октября 2018

Я использую riak2.2.3 и пытаюсь выполнить поиск по типу сегмента карты, но ничего не возвращается.

Я настроил тип контейнера "dist_cache" на серверной части памяти:

# riak-admin bucket-type status dist_cache
dist_cache is active

active: true
allow_mult: true
backend: <<"memory_mult">>
basic_quorum: false
big_vclock: 50
chash_keyfun: {riak_core_util,chash_std_keyfun}
claimant: 'riak@127.0.0.1'
datatype: map
dvv_enabled: true
dw: quorum
last_write_wins: false
linkfun: {modfun,riak_kv_wm_link_walker,mapreduce_linkfun}
n_val: 3
notfound_ok: true
old_vclock: 86400
postcommit: []
pr: 0
precommit: []
pw: 0
r: quorum
rw: quorum
search_index: <<"expirable_token">>
small_vclock: 50
w: quorum
young_vclock: 20

Затем я включил поиск в / etc / riak /:

search = on

Затем я настроил индекс со схемой по умолчанию и связал его с типом сегмента (см. Выше).

Я могу успешно хранить и извлекать значения, используя ключи, в этом сегменте. Я сохранил 3 значения в регистрах: двоичные данные, целое число (отметка времени) и строку:

[
  {{"attrs", :register}, <<131, 97, 111>>},
  {{"iat_i", :register}, "1540923453"},
  {{"test_s", :register}, "paul"}
]

(отображается после форматирования из оболочки Elixir с использованием библиотеки Riak Elixir.)

Однако при поиске следующих значений ничего не найдено:

iex(74)> :riakc_pb_socket.search(pid, "expirable_token", "iat_i:[0 TO *]")
{:ok, {:search_results, [], 0.0, 0}}
iex(75)> :riakc_pb_socket.search(pid, "expirable_token", "iat_i:1540923453")
{:ok, {:search_results, [], 0.0, 0}}
iex(76)> :riakc_pb_socket.search(pid, "expirable_token", "test_s:paul")     
{:ok, {:search_results, [], 0.0, 0}}
iex(77)> :riakc_pb_socket.search(pid, "expirable_token", "test_s:*")   
{:ok, {:search_results, [], 0.0, 0}}

Кроме того, /var/log/riak/solr.log не показывает сообщений об ошибках для этих запросов.

Я что-то упустил? Мне нужно было удалить несколько опций из опций запуска java, но теперь кажется, что java запущен и работает, и solr.log выдает сообщение об ошибке при попытке искаженного запроса.

EDIT:

После попытки решения @ vempo:

Я добавил суффикс к полю _register, но он все равно не работает. Вот как выглядит поле:

iex(12)> APISexAuthBearerCacheRiak.get("ddd", opts)                 
[
  {{"attrs", :register}, <<131, 98, 0, 0, 1, 188>>},
  {{"iat_i", :register}, "1542217847"},
  {{"test_flag", :flag}, true},
  {{"test_register", :register}, "pierre"}
]

но поисковый запрос по-прежнему не дает результата:

iex(15)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:*")   
{:ok, {:search_results, [], 0.0, 0}}
iex(16)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:pierre")   
{:ok, {:search_results, [], 0.0, 0}}
iex(17)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:*")        
{:ok, {:search_results, [], 0.0, 0}}
iex(18)> :riakc_pb_socket.search(pid, "expirable_token", "test_flag:true")    
{:ok, {:search_results, [], 0.0, 0}}
iex(19)> :riakc_pb_socket.search(pid, "expirable_token", "test_flag:*")  

Все еще знаете вывод в /var/log/riak/solr.log, и индекс кажется правильно настроенным:

iex(14)> :riakc_pb_socket.list_search_indexes(pid)                       
{:ok,
 [
   [index: "expirable_token", schema: "_yz_default", n_val: 3],
   [index: "famous", schema: "_yz_default", n_val: 3]
 ]}

1 Ответ

0 голосов
/ 12 ноября 2018

Для поиска по картам правила разные. Согласно Поиск с типами данных , существует четыре схемы для карт, по одной для каждого встроенного типа:

  • * _ флаг
  • * _ счетчик
  • * _ регистр
  • * _ комплект

Так что в вашем случае вы должны искать attrs_register, iat_i_register и test_s_register.

В качестве примечания, суффиксы _s и _i, вероятно, являются избыточными. Они используются схемой по умолчанию для определения типа обычного поля, но бесполезны со встроенными типами данных.

UPDATE

И подытожив правила:

  • поле флага с именем test будет проиндексировано как test_flag (запрос test_flag:*)
  • поле регистра с именем test будет проиндексировано как test_register (запрос test_register:*)
  • поле счетчика с именем test будет проиндексировано как test_counter (запрос test_counter:*)
  • поле набора с именем test будет проиндексировано как test_set (запрос test_set:*)

Это хорошо показано в таблице в Поиск с типами данных: встроенные схемы .

См. Также определение динамических полей для встроенных типов данных в схеме по умолчанию , раздел <!-- Riak datatypes embedded fields -->.

...