【问题标题】:sphinx search: querying using implicit AND not returning the result狮身人面像搜索:使用隐式查询 AND 不返回结果
【发布时间】:2015-07-17 08:22:51
【问题描述】:

使用 sphinx search v2.2.9,此查询返回特定记录:

((@(author) fstaed) | (@(authsurname) fstaed) | (@(authori) fstaed) )

此查询也返回相同的记录:

(@(issued) 2007)

但是这个查询(我认为是上述两个查询的隐含“AND”组合不返回记录:

(@(issued) 2007) ((@(author) fstaed) | (@(authsurname) fstaed) | (@(authori) fstaed) ) 

为什么?

更新 1:

我可以使用 mysql 命令行重现这个问题,下面显示了运行上述 3 个测试中的每一个。请注意, id: 187 在两个单独的结果集中,但不在组合结果集中。

$ mysql -h0 -P9306
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 2.2.9-id64-release (rel22-r5006)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT id, weight() FROM `work` WHERE MATCH('(@(issued) 2007)') AND `sphinx_deleted` = 0 LIMIT 0, 1000 OPTION ranker=proximity_bm25
-> ;
+------+----------+
| id   | weight() |
+------+----------+
|  187 |     1604 |
|  200 |     1604 |
|  215 |     1604 |
..i cutoff these results as irrelevant.
+------+----------+
40 rows in set, 1 warning (0.01 sec)

mysql> SELECT id, weight() FROM `work` WHERE MATCH('((@(author) fstaed)  | (@(authsurname) fstaed)  | (@(authori) fstaed) )') AND `sphinx_deleted` = 0 LIMIT 0, 1000 OPTION ranker=proximity_bm25
-> ;
+------+----------+
| id   | weight() |
+------+----------+
|  187 |     1560 |
|  383 |     1560 |
+------+----------+
2 rows in set, 1 warning (0.01 sec)

mysql> SELECT id, weight() FROM `work` WHERE MATCH('(@(issued) 2007) ((@(author) fstaed)  | (@(authsurname) fstaed)  | (@(authori) fstaed) )') AND `sphinx_deleted` = 0 LIMIT 0, 1000 OPTION ranker=proximity_bm25
-> ;
Empty set, 1 warning (0.01 sec)

mysql> 

更新 2:

我还应该提到,“工作”索引是多个索引之间的分布式索引,包括“iresrevi1_core”和“iresrevi2_core”。 “已发布”字段在 iresrevi2_core 索引中为空(在 iresrevi1_core 索引中不为空),并且正在搜索的 authori 字段在相反索引 iresrevi1_core 中为空(在 iresrevi2_core 索引中不为空)。

我认为这可能与此有关?我可以确认,如果我直接查询 2 个索引,iresrevi1_core 索引将返回已发布的搜索数据,但 iresrevi2_core 索引将不会返回已发布的搜索数据。反之亦然,iresrevi2_core 将返回作者搜索数据,但 iresrevi1_core 不会。

我分布了多个索引,这样我就可以使用“非中缀”方法(强制“中缀”字段在此索引中为空白)以及我想要搜索的所有字段来索引我想要搜索的所有字段使用“中缀”方法的搜索位于另一个索引上,所有“非中缀”字段都被清空。 2 个来源/索引如下所示:

source srcresrevi1 : srcresrev
{
    sql_query       = \
    select SQL_NO_CACHE `work`.`ID` AS `ID`, '' as authori \
     from work \
     WHERE (`work`.`ID` BETWEEN $start AND $end) \
     and `work`.`ID` <= (select max_id from sphinx_deltas where id = 1)

sql_joined_field = authsurname from ranged-query; \
    SELECT SQL_NO_CACHE wa.work_id AS ID, s.surname \
    from `work_authors` wa, \
         `author_surnames` s \
    where wa.author_surname_id = s.id \
    and wa.work_id >= $start and wa.work_id <= $end \
    and `wa`.`work_ID` <= (select max_id from sphinx_deltas where id = 1) \
    order by wa.work_id ASC; \
    select min(work_id), max(work_id) from `work_authors` \
    where work_id <= (select max_id from sphinx_deltas where id = 1)

sql_joined_field = author from ranged-query; \
    SELECT SQL_NO_CACHE wa.work_id AS ID, CONCAT(f.given,' ',s.surname) \
    from `work_authors` wa, `author_surnames` s, `author_fnames` f \
    where wa.author_surname_id = s.id \
    and wa.author_fname_id = f.id \
    and wa.work_id >= $start and wa.work_id <= $end \
    and `wa`.`work_ID` <= (select max_id from sphinx_deltas where id = 1) \
    order by wa.work_id ASC; \
    select min(work_id), max(work_id) from `work_authors` \
    where work_id <= (select max_id from sphinx_deltas where id = 1)

sql_joined_field = issued from ranged-query; \
    SELECT SQL_NO_CACHE work_id AS ID, `year` \
    from issued \
    where work_id >= $start and work_id <= $end \
    and work_ID <= (select max_id from sphinx_deltas where id = 1) \
    order by work_id ASC; \
    select min(work_id), max(work_id) from `issued` \
    where work_id <= (select max_id from sphinx_deltas where id = 1)
}

source srcresrevi2 : srcresrev
{
    sql_query       = \
    select SQL_NO_CACHE `work`.`ID` AS `ID`, '' as authsurname, '' as author, '' as issued \
            from work \
            WHERE (`work`.`ID` BETWEEN $start AND $end) \
            and `work`.`ID` <= (select max_id from sphinx_deltas where id = 1)

sql_joined_field = authori from ranged-query; \
    SELECT SQL_NO_CACHE wa.work_id, CONCAT(f.given,' ',s.surname) \
    from `work_authors` wa, `author_surnames` s, `author_fnames` f \
    where wa.author_surname_id = s.id \
    and wa.author_fname_id = f.id \
    and work_id >= $start and work_id <= $end \
    and work_ID <= (select max_id from sphinx_deltas where id = 1) \
    order by wa.work_id ASC; \
    select min(work_id), max(work_id) from `work_authors` \
    where work_id <= (select max_id from sphinx_deltas where id = 1)
}

index iresrevi1_core
{
source          = srcresrevi1
path = /home/resrev/pubrevit/db/sphinx/development/iresrevi1
docinfo         = extern
dict            = keywords
mlock           = 0
morphology      = stem_en
charset_table = 0..9, A..Z->a..z, _, a..z, \
        U+410..U+42F->U+430..U+44F, U+430..U+44F
min_word_len        = 3
expand_keywords     = 0
ngram_len       = 1
ngram_chars     = U+3000..U+2FA1F
html_strip      = 1
html_remove_elements    = style, script, head, DOCTYPE, !DOCTYPE
inplace_enable      = 1
index_exact_words   = 0
index_sp        = 0
index_field_lengths = 1
}

index iresrevi2_core
{
source          = srcresrevi2
path = /home/resrev/pubrevit/db/sphinx/development/iresrevi2
docinfo         = extern
dict            = keywords
mlock           = 0
morphology      = stem_en
charset_table = 0..9, A..Z->a..z, _, a..z, \
        U+410..U+42F->U+430..U+44F, U+430..U+44F
min_word_len        = 3
min_infix_len       = 3
expand_keywords     = 1
ngram_len       = 1
ngram_chars     = U+3000..U+2FA1F
html_strip      = 1
html_remove_elements    = style, script, head, DOCTYPE, !DOCTYPE
inplace_enable      = 1
index_exact_words   = 0
index_sp        = 1
index_field_lengths = 1
}

【问题讨论】:

  • 你如何测试这个?您是否确认您正在寻找的结果不仅仅是在另一个结果“页面”上?
  • 嗨@barryhunter 我用mysql测试成绩单更新了问题。基本上我使用mysql监视器复制了这个。我不确定是否需要任何其他信息?
  • @barryhunter 好的,现在我发现它与多索引查询有关就是这样,我很高兴你的回答,我给你的功劳。我想我现在需要问一个新问题,如果我要使用 dict=keywords 在同一个查询中混合中缀字段和非中缀字段

标签: sphinx


【解决方案1】:

所以是的,问题在于多个不同的索引。 UNION 不加入。

除了您找到的主题之外,这里还有一个更新的主题,其中提到可能使用@@relaxed 来解决它。它可能适用于分布式索引。

http://sphinxsearch.com/forum/view.html?id=13581

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多