【问题标题】:Sphinx not always returning string attributesSphinx 并不总是返回字符串属性
【发布时间】:2012-10-31 15:41:01
【问题描述】:

在某些情况下,Sphinx 返回的结果没有我声明为 sql_attr_string 的 JOIN 字段。以下面的源/索引配置为例:

source myapp_recipe
{
    type                = pgsql
    sql_host            = 
    sql_user            = me
    sql_pass            = secret
    sql_db              = myapp_db
    sql_port            = 

    sql_query           = \
        SELECT myapp_recipe.id as id, \
            myapp_recipe.name as name, \
            myapp_recipe.cookbook_id as cookbook_id, \
            myapp_cookbook.name as cookbook_name, \
            'recipe' as content_type \
        FROM myapp_recipe \
        INNER JOIN myapp_cookbook \
        ON myapp_recipe.cookbook_id = myapp_cookbook.id

    #content_type for django
    sql_attr_string       = content_type

    # stored string fields in the document
    sql_attr_string     = cookbook_name

    # stored and indexed string fields
    sql_field_string     = name

    # ForeignKey's
    sql_attr_uint       = cookbook_id
}

index myapp_recipe
{
    source          = myapp_recipe
    path            = /var/data/myapp_recipe
    docinfo         = extern
    morphology      = none
    stopwords       =
    min_word_len    = 2
    charset_type    = utf-8
    min_prefix_len  = 0
    min_infix_len   = 3
    enable_star     = 0
}

对于某些搜索,返回的结果文档除了content_typename 之外没有其他属性。对于返回相同文档的不同搜索,Sphinx 很可能返回具有所有预期属性的相同结果文档。

示例: 查询“pizza”将返回不完整的结果文档(documentA),没有 JOIN'd 字符串属性。

对“pizza pocket”的查询将返回具有所有预期 JOIN 属性的相同文档 (documentA)。

谁能解释这种莫名其妙的行为?

【问题讨论】:

    标签: sphinx


    【解决方案1】:

    检查您是否没有重复的 id 您的 sql_query 必须返回具有唯一 id 的结果,否则 Sphinx 可以拥有多个相同 id 的文档(对于 Sphinx,id 被视为一个简单的数字,不适用任何唯一性规则)。当您编制索引时,应该会发出警告,指出您有重复项。

    【讨论】:

    • 我没有看到使用此配置的任何索引警告。我正在使用这样的调用搜索多个索引:client.Query("pizza", "myapp_table1 myapp_table2 myapp_table3")。会不会和这个问题有关?
    • 我偷偷怀疑这就是问题所在,既然你已经让我走上了这条路 - 当我从多个索引中匹配时,问题似乎就会发生。关于如何避免这个问题的任何想法?
    • 由于“document id”是postgres中对象的“id”,我不知道在查询多个索引时如何避免重复的id。
    • 解决方法是对每个需要搜索的索引使用AddQuery()。一行 Query("myquery", "index1 index2 index3") 要求 index1、index2 和 index3 中的每个文档都有唯一的 id。由于我的索引代表 Django 模型表,因此它们将具有重复的 id。谢谢 aditirex。
    • 因此,供其他人将来参考 - 传递给 Query("myquery", "table1 table2 table3") 的表之间的重复 ID 将以神秘的方式破坏您的搜索结果。 :)
    猜你喜欢
    • 2020-02-27
    • 2016-12-16
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多