我正在重新设计我们的公司网站之一。我的老板想要解决用搜索框替换我们所有导航的想法..搜索框应该能够查询我们的任何无关数据表。
所以现在我正在试用5张桌子。
产品 制造商 类别 配料 用途
因此应该能够查找产品名称,制造商名称,类别名称,成分名称或用途名称
当我检索结果时。如果用户点击了制造商搜索结果,则会将他们带到查找该制造商的所有产品的制造商页面。 点击产品页面链接时,会将其带到实际的产品信息中。 成分将把它们带到一个页面,显示所有含有该成分的产品。
无论如何这里是我的数据配置
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/xxx" user="xxx" password="xxx" />
<document>
<entity name="manufacturer" transformer="TemplateTransformer" pk="manNum"
query="SELECT manNum, manName FROM manufacturer
WHERE active = 1">
<field column="id" name="id" template="MAN-${manNum}" />
<field column="type" template="manufacturer" name="type"/>
<field column="manName" name="text"/>
<field column="manNum" name="manNum"/>
</entity>
<entity name="product" transformer="TemplateTransformer"
query="SELECT products.prodNum, products.prodName as text, m.manName FROM products JOIN man m USING (manNum)
WHERE products.active = 1
AND (hideWeb = 0 or hideWeb IS NULL)">
<field column="id" template="PROD-${products.prodNum}" name="id"/>
<field column="type" template="product" name="type"/>
<field column="text" name="text"/>
<field column="manName" name="manName"/>
</entity>
<entity name="ingredients" transformer="TemplateTransformer" pk="id"
query="SELECT id, text FROM inglist WHERE sort != ''">
<field column="id" name="id" template="ING-${inglist.id}"/>
<field column="type" template="ingredient" name="type"/>
<field column="text" name="text" />
</entity>
<entity name="uses" transformer="TemplateTransformer" pk="id"
query="SELECT id, text FROM useslist">
<field column="id" name="id" template="USE-${id}"/>
<field column="type" template="use" name="type"/>
<field column="text" name="text"/>
</entity>
<entity name="categories" transformer="TemplateTransformer" pk="id"
query="SELECT id, textShow as text FROM categorylist">
<field column="id" name="id" template="CATEGORY-${id}"/>
<field column="type" template="category" name="type"/>
<field column="text" name="text"/>
</entity>
</document>
</dataConfig>
我的架构..
<fields>
<field name="id" type="string" indexed="true" stored="true"/>
<field name="text" indexed="true" stored="true" type="text"/>
<field name="type" type="string" indexed="false" stored="true"/>
<field name="manName" type="text" indexed="false" stored="true"/>
<field name="manNum" type="string" indexed="false" stored="false"/>
</fields>
现在也许我没有以正确的方式做到这一点......并且可能有更好的方法来解决这个问题。
无论如何,我现在遇到的问题是我得到的错误缺少必填字段“id”。现在产品查询和制造商查询在选择中没有id列..但我认为转换查询应该处理它?如果我选择prodNum作为id ..那么所有id都会相互覆盖。
现在我可能会在实际查询中将其连接起来...并且这样做是最后的手段,但我想知道我在解决这个问题时遇到了什么问题。
修改 没关系,这只是一个菜鸟问题,出于某种原因我认为模板变量是指SQL中的表名而不是实体名, 所以我替换了所有的 同
它有效。
答案 0 :(得分:0)
使用不同的字符或字符串作为特定于表的ID的前缀是个好主意。我在SQL中执行此操作,这允许我检查Solr之外的行为。
select
concat('b',cast(b.id as char)) as id,
...
答案 1 :(得分:0)
这是一个noob问题,
由于某种原因,我认为模板变量引用了SQL中的表名而不是实体名。
答案 2 :(得分:0)
我这样做:
<entity name="GG-Boryslaw-1939-Phonebook"
transformer="TemplateTransformer,DateFormatTransformer"
pk="id"
query="SELECT * FROM boryslaw_1939_phonebook">
<field column="record_id" template="GG-Boryslaw-1939-Phonebook-${GG-Boryslaw-1939-Phonebook.id}" />
<field column="record_type" template="phonebook" />
<field column="record_source" template="Boryslaw Phonebook (1939)" />
<field column="record_date" template="${GG-Boryslaw-1939-Phonebook.Year}" dateTimeFormat="yyyy" />
...etc...
</entity>