逃离狮身人面像

时间:2016-11-12 21:50:09

标签: escaping sphinx

我正在尝试匹配文档中的短语,不幸的是,我在目录中的格式如下:

Includes sides?** *No*

Includes sides?** *Yes*

搜索任何一个失败,例如

Search idx_test where MATCH('"Includes sides?** *Yes*"')

如果我搜索

Search idx_test where MATCH('"Includes sides"')

它不会失败(但同时找到)

如果我作为测试将数据本身更改为:

Includes sides No

我可以用Sphinx找到它

Search idx_test where MATCH('"Includes sides No"')

很明显,?*需要转义。然而,我没有做过任何工作,例如使用\*

2 个答案:

答案 0 :(得分:0)

试。,

...where MATCH('"Includes sides\\? \\*Yes\\*"')

需要多个,一个在sql字符串中,第二个用于扩展语法查询。

如果你也用像php这样的语言把它写成一个字符串,可能需要更多引号,以便在php字符串中转义。

也可以从查询中删除它们,它们只有查询语法,因此不需要更改数据。

(如果使用phrase_boundary

,则稍微复杂一点

答案 1 :(得分:0)

我尝试了一些不起作用的解决方案:

  1. 我在配置中添加了regexp_来映射?=>qmark*=>asterisk。无论我如何搜索,Includes sidesqmarkIncludes sides qmark(后者假设?被视为单独的工作

  2. ,我都没有运气
  3. 我评论了正则表达式,并尝试在Includes Sides No上搜索?*没有被编入索引的逻辑,因此这些空格不存在。

  4. 我在Includes sidesNo之间添加了间隔,假设一个或多个字符没有索引但是以某种方式占用了字符空间,例如Includes sides No

  5. 我添加了双重逃脱,正如我所建议的那样`"包括双方\?\ * \ * \ *否"也失败了。

  6. 这些都不起作用。

    我尝试过NEAR /和>>一起工作:

    ("Includes sides" NEAR/2 "No") ("Includes sides" >> "No")
    

    看起来很笨重。

    最后我做了这个有效的工作

    "Includes sides \\*"No"
    

    哪个有效,但对我来说是一个完全神秘的原因虽然我发布它,因为它解决了问题。我希望其他人可以解释这背后的机制:

    • 显然\\是在sphinxql
    • 中逃脱的正确方法
    • 明显逃避星号正在运作
    • 显然逃避?不是
    • 然而,如果星号需要逃脱,那么为何如此:

    "Includes sides\\?\\*\\* \\*No

    不起作用

    "Includes sides\\*\\* \\*No

    不起作用?如果它没有索引/识别?但显然是*,那么我需要在Includes之后逃避这两个问题。然而,?之后的*Includes都不存在,但asterisk之前的No也不存在。

    很抱歉,如果我的解决方案有效,请回答问题。如果我有更好的方式来提供我使用的解决方案和它所揭示的问题,请告诉我,因为我不想在这里混淆问题。