存储和搜索复杂数字数据的方法有哪些?

时间:2014-03-30 00:50:38

标签: sql xml database

我有一些必须可从网络前端搜索的数字数据,格式如下:

玩具类型:狗
玩具子类型:斑点
玩具制造商:约翰 颜色:白色
预计景点:10
实际地点:11

玩具类型:猫
玩具子类型:条纹
玩具制造商:简
颜色:白色
估计条纹:5
实际条纹:[尚未计算]

搜索查询可能类似于“类型:猫,条纹:4-6”或“类型:狗,子类型:斑点”或“颜色:白色”或“颜色:白色,制造者:约翰”

我不确定数据是否最适合关系数据库,因为有几种类型和子类型,每种都有自己的属性。最重要的是,每个属性都有估计值和实际值。

我想了解如何存储和搜索这些数据的一些建议。请帮忙!

编辑:我更改了搜索查询,使其不再是自由格式。

2 个答案:

答案 0 :(得分:0)

您已经以这样的方式构建问题,使其难以解决。您的数据是结构化数据,具有特定列。但是,您正在尝试使用自由格式查询来搜索它。

因此,正常的方法是允许每个字段的搜索术语。

接下来的另一种方法是全文问题。这肯定有它的问题。例如,数字通常是停用词。不同领域的价值观会相互混淆。

当然,您可以尝试对结构化数据进行自由格式搜索。毕竟,这是谷歌和微软正在做的事情。如果您在Google上搜索“从纽约到伦敦的机票”,您将获得航班列表。但通过理解查询来解决这个问题很难。

答案 1 :(得分:0)

我建议使用Apache Solr来索引和搜索您的数据。

您如何使用Solr取决于您的要求。我用它作为我的数据的可搜索缓存。当原始主数据必须作为文件保存时非常有用。许多框架将Solr整合为搜索后端。

要构建Solr索引的前端,请结帐solr-ajax

实施例

安装Solr

下载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

data.xml中

您没有指定数据格式,因此我使用了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中的每个文档都必须具有唯一ID
  • 字段名称的名称后面带有“_s”和“_i”,表示字段类型。这是利用Solr dynamic field功能的作弊。

索引XML文件

将数据导入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>