问题描述
Erlang中是否有一种方法可以在ets表上创建一个选择查询,该查询将获取包含所搜索文本的所有元素?
ets:select(Table,[{ %% Match spec for select query
{'_',#movie_data{genre = "Drama" ++ '_',_ = '_'}},% Match pattern
[],% Guard
['$_'] % Result
}]) ;
此代码仅提供给我以开头(=前缀)为必需文本(文本=“ Drama”)的数据,但是问题是我还需要包含数据的结果,像这个例子:
#movie_data {genre =“ 动作,戏剧 ”}
我试图将后卫换成类似的东西-
{'_',#movie_data{genre = '$1',_='_'}},[string:str('$1',"Drama") > 0] ...
但是问题在于它不是合格的保护表达式。
感谢您的帮助!
解决方法
不可能。您需要将数据结构设计为可由保护表达式搜索,例如:
-record(movie_data,{genre,name}).
-record(genre,{comedy,drama,action}).
example() ->
Table = ets:new('test',[{keypos,2}]),ets:insert(Table,#movie_data{name = "Bean",genre = #genre{comedy = true}}),#movie_data{name = "Magnolia",genre = #genre{drama = true}}),#movie_data{name = "Fight Club",genre = #genre{drama = true,action = true}}),ets:select(Table,[{#movie_data{genre = #genre{drama = true,_ = '_'},[],['$_']
}]).