我正在尝试使用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>
如你所见,。我将讨论分组在每个标题/主题下。所有的回复都有相同的topic_id作为外键。
我面临的问题是,当我导入数据。只有第一个讨论是可搜索的。如果我在任何回复中搜索文本,我不会得到任何结果。
我这样做对吗?有些话题可能有数百个回复。而且目前没有任何回复被索引或存储。
我如何得到的答复是可搜索的,以及?
。如果这是样本数据…
- 测试主题名称在这里
- 此处帖子的原始回复/讨论
- 附加回复1
- 另一个回复二。
在上面的例子中。我可以搜索"这里的测试主题名称"answers"这里的帖子的原始回复/讨论"
但是当我搜索"额外回复一个"或"另一个回复两个"时,我得到零结果
我自己搞定了。(这句话差点让我失去理智)
尝试了各种组合。最后将讨论实体与主题实体交换。(基本上父和子互换)
所以我现在索引每个讨论实体的主题实体。
一种奇怪的方法,但它有效。
是工作的配置片段。只是以防将来它能帮助到任何人。
<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的所有消息分组在一起,以便每个主题只得到一个结果。
文档确实需要改进,它没有提到太多。
希望这有助于一个流浪的灵魂在未来。:)