我有一些必须可从网络前端搜索的数字数据,格式如下:
玩具类型:狗
玩具子类型:斑点
玩具制造商:约翰
颜色:白色
预计景点:10
实际地点:11
玩具类型:猫
玩具子类型:条纹
玩具制造商:简
颜色:白色
估计条纹:5
实际条纹:[尚未计算]
搜索查询可能类似于“类型:猫,条纹:4-6”或“类型:狗,子类型:斑点”或“颜色:白色”或“颜色:白色,制造者:约翰”
我不确定数据是否最适合关系数据库,因为有几种类型和子类型,每种都有自己的属性。最重要的是,每个属性都有估计值和实际值。
我想了解如何存储和搜索这些数据的一些建议。请帮忙!
编辑:我更改了搜索查询,使其不再是自由格式。
答案 0 :(得分:0)
您已经以这样的方式构建问题,使其难以解决。您的数据是结构化数据,具有特定列。但是,您正在尝试使用自由格式查询来搜索它。
因此,正常的方法是允许每个字段的搜索术语。
接下来的另一种方法是全文问题。这肯定有它的问题。例如,数字通常是停用词。不同领域的价值观会相互混淆。
当然,您可以尝试对结构化数据进行自由格式搜索。毕竟,这是谷歌和微软正在做的事情。如果您在Google上搜索“从纽约到伦敦的机票”,您将获得航班列表。但通过理解查询来解决这个问题很难。
答案 1 :(得分:0)
我建议使用Apache Solr来索引和搜索您的数据。
您如何使用Solr取决于您的要求。我用它作为我的数据的可搜索缓存。当原始主数据必须作为文件保存时非常有用。许多框架将Solr整合为搜索后端。
要构建Solr索引的前端,请结帐solr-ajax。
下载Solr发布:
wget http://www.apache.org/dist/lucene/solr/4.7.0/solr-4.7.0.tgz
tar zxvf solr-4.7.0.tgz
使用嵌入式Jetty容器启动Solr:
cd solr-4.7.0/example
java -jar start.jar
Solr现在应该在本地运行
http://localhost:8983/solr
您没有指定数据格式,因此我使用了Solr支持的原生XML:
<add>
<doc>
<field name="id">1</field>
<field name="toy_type_s">Dog</field>
<field name="toy_subtype_s">Spotted</field>
<field name="toy_maker_s">John</field>
<field name="color_s">White</field>
<field name="estimated_spots_i">10</field>
<field name="actual_spots_i">11</field>
</doc>
<doc>
<field name="id">2</field>
<field name="toy_type_s">Cat</field>
<field name="toy_subtype_s">Striped</field>
<field name="toy_maker_s">Jane</field>
<field name="color_s">White</field>
<field name="estimated_spots_i">5</field>
</doc>
</add>
注意:
将数据导入Solr的方法很多。最简单的方法是curl命令:
curl http://localhost:8983/solr/update?commit=true -H "Content-Type: text/xml" --data-binary @data.xml
值得注意的是,Solr支持其他数据格式,例如JSON和CSV。
同样有语言库支持Solr搜索,以下示例使用curl。 Solr search syntax符合您的要求。
这是一个简单的例子:
$ curl http://localhost:8983/solr/select/?q=toy_type_s:Cat
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
<lst name="params">
<str name="q">toy_type_s:Cat</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<str name="id">2</str>
<str name="toy_type_s">Cat</str>
<str name="toy_subtype_s">Striped</str>
<str name="toy_maker_s">Jane</str>
<str name="color_s">White</str>
<int name="estimated_spots_i">5</int>
<long name="_version_">1463999035283079168</long>
</doc>
</result>
</response>
更复杂的搜索示例:
$ curl "http://localhost:8983/solr/select/?q=toy_type_s:Cat%20AND%20estimated_spots_i:\[2%20TO%206\]"
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">2</int>
<lst name="params">
<str name="q">toy_type_s:Cat AND estimated_spots_i:[2 TO 6]</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<str name="id">2</str>
<str name="toy_type_s">Cat</str>
<str name="toy_subtype_s">Striped</str>
<str name="toy_maker_s">Jane</str>
<str name="color_s">White</str>
<int name="estimated_spots_i">5</int>
<long name="_version_">1463999035283079168</long>
</doc>
</result>
</response>