2016-11-12 147 views
0
逃逸

我想匹配不幸在目录中我已经被格式化这样的文档中的短语:在狮身人面像

Includes sides?** *No* 

Includes sides?** *Yes* 

寻找任何一个失败,例如

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

如果我上搜索

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

它不会失败(但发现两者)

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

Includes sides No 

我可以用狮身人面像找到它

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

所以很清楚?*需要逃脱。然而,我没有做过任何工作,例如使用\*

回答

0

试试。

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

需要多个,一个是在sql字符串中,另一个是在扩展语法查询中。

如果你还将它写成像php这样的语言字符串,可能需要更多引号,以便在php字符串中进行转义。

也可以将它们从查询中删除,它们只用于查询语法,所以不需要更改数据。

(Alough稍微复杂一些,如果使用phrase_boundary

+0

从这里开始:'where MATCH('“Includes sides \\?”')'这不会返回'work from home?',但它确实返回了任何'work from home'后跟一个字符,例如' '从home_'工作。 – user3649739

+0

对于从查询中删除的问题,我尝试过'在哪里匹配(''包括双方是'')'假设他们从来没有索引,但这也是一个失败。很难解决,因为从理论上讲,如果它是任何字符,我可以做'包含边?'但是? – user3649739

+0

现在我只是做了“包含边”!((“包含边”近2 /“否”)(“包含边”>>“否”))'。 – user3649739

0

嗯,我试图解决方案的#没有工作:

  1. 我在配置增加regexp_映射?=>qmark*=>asterisk。我曾与这个没有运气,无论我如何搜索即Includes sidesqmarkIncludes sides qmark(后者假设?作为独立的工作

  2. 处理我评论的正则表达式退了出去,并在逻辑试图寻找在Includes Sides No的是?*不被索引所以不存在这些空间。

  3. 我加Includes sidesNo之间的间隔假设一个或多个字符的没有索引,但不知何故占用一个字符空间,例如Includes sides No

  4. 我添加了两次转义,正如我所建议的那样``包括方面\?\ * \ * \ *否“也失败了。

这些都没有工作。

我试图做NEAR /和>>在一起,并且工作:

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

这似乎笨重。

最后我做这个工作,其

"Includes sides \\*"No" 

其中一期工程,但总谜我为什么,虽然,因为它解决了这个问题,我张贴。我希望别人能解释这背后的机制:

  • 显然\\是sphinxql逃生的正确方法
  • 显然逃脱星号工作
  • 显然逃脱?
  • 然而,如果星号必须然后逃亡怎么来的:

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

不工作,

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

不起作用?如果它不索引/识别?但很明显是*那么我需要在Includes之后逃脱这两个。然而它好像?Includes之后都不存在,但之前存在asterisk

对不起,包括问题和答案,但我的解决方案工作。如果我有更好的方式提供我使用的解决方案和它显示的问题,请让我知道,因为我试图不在这里混淆问题。

+0

您是否检查过使用'phrase_boundary'?如果你有'?'在那里,这将复杂词组匹配。还检查是否?和*在charset_table中。在你的情况下,仍然会推荐他们不在charset_table中。 – barryhunter