Mysql 向SQL添加数据时,Sphinx是否自动更新索引?

Mysql 向SQL添加数据时,Sphinx是否自动更新索引?,mysql,sphinx,Mysql,Sphinx,我很好奇,当您添加新的SQL数据时,Sphinx是否会自动更新其索引,或者您是否必须特别告诉它来重新索引数据库 如果没有,是否有人能举例说明如何在数据库数据更改时自动执行此过程?如 实时索引(为简洁起见,称为RT索引)是一种新的后端,允许您动态插入、更新或删除文档(行) 因此,要动态更新索引,只需进行如下查询 {INSERT | REPLACE} INTO index [(column, ...)] VALUES (value, ...) [, (...)] 进一步介绍Anne的答案——如果使

我很好奇,当您添加新的SQL数据时,Sphinx是否会自动更新其索引,或者您是否必须特别告诉它来重新索引数据库

如果没有,是否有人能举例说明如何在数据库数据更改时自动执行此过程?

实时索引(为简洁起见,称为RT索引)是一种新的后端,允许您动态插入、更新或删除文档(行)

因此,要动态更新索引,只需进行如下查询

{INSERT | REPLACE} INTO index [(column, ...)]
VALUES (value, ...)
[, (...)]

进一步介绍Anne的答案——如果使用SQL索引,它不会自动更新。您可以在每次更改后管理重新编制索引的过程,但这可能会很昂贵。解决这个问题的一种方法是使用一个包含所有内容的核心索引,然后是一个具有相同结构的增量索引,该结构只对更改进行索引(这可以通过布尔或时间戳列来完成)

这样,您就可以在超常规的基础上重新编制增量索引(更小,因此更快),然后不太定期地同时处理核心和增量(但最好至少每天这样做)


但是,除此之外,新的RT索引是值得一看的——您仍然需要自己更新内容,而且它与数据库无关,因此它是一种不同的思维方式。另外:RT索引没有SQL索引所具有的所有功能,因此您需要决定什么更重要。

答案是否定的,您需要告诉sphinx重新编制数据库索引

您需要了解一些步骤和要求:

  • 主要和三角洲是需求
  • 首先,你需要索引你的主索引
  • 在第一次运行之后,您可以通过旋转delta对其进行索引(以确保服务正在运行,并且web上的数据在运行时可以使用)
  • 在执行下一步之前,您需要创建一个表来标记“上一个索引行”。最后一个索引行ID可用于下一个索引增量,并将增量合并到主索引中
  • 您需要将增量索引合并到主索引。 就像斯芬克斯的文件一样
  • 重新启动sphinx服务

    提示:创建自己的程序,可以使用C#或其他语言执行索引。您可以尝试windows的任务计划也可以

  • 这是我的配置文件:

    source Main
    {
    type            = mysql
    
    sql_host        = localhost
    sql_user        = root
    sql_pass        = password
    sql_db          = table1
    sql_port        = 3306  # optional, default is 3306
    sql_query_pre = REPLACE INTO table1.sph_counter SELECT 1, MAX(PageID) FROM table1.pages;
    sql_query       = \
        SELECT  pd.`PageID`, pd.Status from table1.pages pd
        WHERE pd.PageID>=$start AND pd.PageID<=$end \
        GROUP BY pd.`PageID`
    
    sql_attr_uint       = Status
    
    sql_query_info      = SELECT * FROM table1.`pages` pd WHERE pd.`PageID`=$id
    sql_query_range     = SELECT MIN(PageID),MAX(PageID)\
                  FROM tabl1.`pages`
    sql_range_step      = 1000000
    }
    
    
    source Delta : Main
    {
    sql_query_pre = SET NAMES utf8
    
    sql_query = \
        SELECT  PageID, Status from pages \
        WHERE PageID>=$start AND PageID<=$end 
    
    sql_attr_uint       = Status
    
    sql_query_info      = SELECT * FROM table1.`pages` pd WHERE pd.`PageID`=$id
    sql_query_range     = SELECT (SELECT MaxDoc FROM table1.sph_counter WHERE ID = 1) MinDoc,MAX(PageID) FROM table1.`pages`;
    sql_range_step      = 1000000
    }
    
    
    index Main
    {
    source          = Main
    path            = C:/sphinx/data/Main
    docinfo         = extern
    charset_type        = utf-8
    }
    
    
    index Delta : Main
    {
        source = Delta
    path = C:/sphinx/data/Delta
    charset_type = utf-8
    }
    
    sourcemain
    {
    type=mysql
    sql\u host=localhost
    sql\u user=root
    sql\u pass=密码
    sql_db=table1
    sql_port=3306#可选,默认为3306
    sql\u query\u pre=REPLACE INTO table1.sph\u计数器从table1.pages中选择1,MAX(PageID);
    sql\u查询=\
    从表1.pd中选择pd.`PageID',pd.Status
    
    WHERE pd.PageID>=$start和pd.PageID=$start和PageIDSo您在哪里运行这个类似SQL的语句?我正在阅读文档,但它们的所有示例都显示它是在mysql中查询的。您可以通过您最喜欢的mysql客户端发出这个问题,如果传递--rotate参数,则无需重新启动searchd。