我正在尝试使用Apache SOLR索引我的Mysql数据库。目的是让solr处理所有与用户相关的搜索。
我正在将数据索引为父子关系,如教程中所示(http://wiki.apache.org/solr/DataImportHandler#Using_delta-import_command)
基本上我正在尝试搜索论坛讨论。所有帖子标题都存储在名为" adda_topic"的表中。所有回复都存储在" adda_discussion" (第一个消息是第一个帖子的消息/内容)
这是我的data-config.xml文件
<document name="forum_posts">
<entity name="forum_topics" pk="topic_id"
query="SELECT *, 'forum' AS type FROM adda_topic"
deltaImportQuery="SELECT *, 'forum' AS type FROM adda_topic WHERE topic_id = '${dataimporter.delta.topic_id}'"
deltaQuery="SELECT topic_id FROM adda_topic WHERE topic_start_date > '${dataimporter.last_index_time}' ">
<field column="topic_id" name="id"/>
<field column="topic_apt_id" name="apt_id"/>
<field column="topic_owner_id" name="owner_id"/>
<field column="type" name="type"/>
<field column="topic_name" name="title"/>
<field column="topic_start_date" name="created_date"/>
<field column="topic_filter_level" name="filter_level"/>
<entity name="discussion" pk="discussion_topic_id" transformer="HTMLStripTransformer"
query="SELECT * FROM adda_discussion WHERE discussion_topic_id = '${forum_topics.topic_id}'"
deltaQuery="SELECT discussion_topic_id FROM adda_discussion WHERE discussion_date > '${dataimporter.last_index_time}'"
parentDeltaQuery="SELECT topic_id FROM adda_topic WHERE topic_id = '${discussion.discussion_topic_id}'">
<field column="discussion_id" name="child_ids"/>
<field column="discussion_text" name="content" stripHTML="true"/>
</entity>
</entity>
</document>
你可以看到
我正在对每个标题/主题下的讨论进行分组。 Ann所有回复都与其外键具有相同的topic_id。
我面临的问题是当我导入数据时。只有第一次讨论是可搜索的。如果我在任何回复中搜索文本,我都不会得到任何结果。
我这样做对吗?一些主题可以有数百个回复。目前没有任何回复被索引或存储。
我如何才能获得可以搜索的回复?
e.g。如果这是样本数据。 。
在上述情况中。我可以在这里搜索&#34;测试主题名称&#34;和#34;原始回复/讨论发布在这里&#34;
但是当我搜索&#34;额外回复1&#34;或&#34;另一个答复二&#34;
答案 0 :(得分:0)
我设法自己解决了这个问题。 (在这个上几乎失去了理智)
尝试了各种组合。最后,将讨论实体与主题实体互换。 (基本上互换父母和孩子)
所以我现在为每个讨论实体索引主题实体。
一种奇怪的方法,但它有效。
这是工作的配置代码段。以防它在将来帮助任何人。
<entity name="discussion" pk="discussion_id" transformer="HTMLStripTransformer"
query="SELECT * FROM adda_discussion"
deltaImportQuery="SELECT * FROM adda_discussion WHERE discussion_id = '${dataimporter.delta.discussion_id}'"
deltaQuery="SELECT discussion_id FROM adda_discussion WHERE discussion_date > '${dataimporter.last_index_time}' ">
<field column="discussion_id" name="id" />
<field column="discussion_text" name="content" stripHTML="true"/>
<field column="discussion_date" name="created_date"/>
<entity name="topic" pk="topic_id"
query="SELECT
*, 'forum' AS type, CONCAT('forum-', topic_id) AS global_id
FROM adda_topic WHERE topic_id='${discussion.discussion_topic_id}'"
deltaQuery="SELECT topic_id FROM adda_topic WHERE topic_start_date > '${dataimporter.last_index_time}'"
parentDeltaQuery="SELECT discussion_topic_id FROM adda_discussion WHERE discussion_topic_id = '${topic.topic_id}'">
<field column="global_id" name="global_id" />
<field column="topic_id" name="parent_id"/>
<field column="topic_apt_id" name="apt_id"/>
<field column="topic_owner_id" name="owner_id"/>
<field column="type" name="type"/>
<field column="topic_name" name="title"/>
<field column="topic_filter_level" name="filter_level"/>
</entity>
</entity>
需要注意的另一点是,我必须使用solr分组将具有相同topic_id的所有消息组合在一起,这样每个主题只能获得一个结果。
文档确实需要改进,它没有多大提及。
希望这有助于未来的游荡灵魂。 :)