【问题标题】:How to restrict drupal search from indexing all content types?如何限制drupal搜索索引所有内容类型?
【发布时间】:2023-03-27 15:31:01
【问题描述】:

我只想索引某些节点。 “搜索配置”模块声称具有此功能,但它不起作用。那么,如何编辑节点模块以仅索引某些节点,或者更好的是,隐含一个可以为我执行此操作的模块?

【问题讨论】:

  • 定义“不起作用”。您是否联系了搜索配置维护人员以获得支持?
  • By 不起作用,我的意思是它阻止它们出现在搜索结果中,但它不会阻止这些节点的索引。这是我需要的。

标签: php search drupal


【解决方案1】:

这是a long standing feature request,但看起来它至少已经被推送到 Drupal 8 了:/

您可以在上面链接的功能请求讨论中找到一些解决方法建议,但搜索配置模块使用的“标准”方法是described here。它不会阻止节点被索引,但会操纵搜索查询以忽略某些条目(例如节点类型),以便它们不会出现在搜索结果页面上。

由于目前没有明显更好的解决方案(afaik),我同意 ceejayoz 的评论,即您应该首先检查为什么搜索配置模块不适合您,然后再开始自定义编码您自己的解决方案。

如果您不得不求助于编辑节点模块本身,node_update_index() 将是开始的地方。

【讨论】:

    【解决方案2】:

    这是确定需要索引的内容的查询,来自node_update_index()

    SELECT n.nid FROM {node} n 
      LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid 
      WHERE d.sid IS NULL OR d.reindex <> 0
      ORDER BY d.reindex ASC, n.nid ASC
    

    您无法阻止索引脚本运行。 但是您可以通过将虚拟条目插入 {search_dataset} 来欺骗查询,使其认为内容已被索引。

    例如,如果您使用 MySQL,请在 cron 上执行此操作:

    INSERT INTO {search_dataset} 
      (sid, type, data, reindex)
      SELECT nid, 'node', '', 0 FROM {node} WHERE node.type IN (RESTRICTED_TYPES)
      ON DUPLICATE KEY UPDATE reindex = 0, data = ''
    

    将“RESTRICTED_TYPES”替换为您的节点类型列表,并对您希望限制搜索的每个实体执行类似的查询。

    【讨论】:

    • 你可能还想清理你的 search_index 表,它会变得非常庞大,如下所示:“DELETE from search_index where sid in (SELECT nid FROM node WHERE node.type IN (RESTRICTED_TYPES)”
    • 还有一点,如果您有一个非常大的数据库,您可能需要手动清理您的 search_total 表:“DELETE FROM search_total WHERE word NOT IN (SELECT DISTINCT word FROM search_index)”。否则 search.module 会耗尽内存,试图在单个查询中加载所有缺失的项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多