2016-11-12 8 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 

Я могу найти его с Sphinx

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

Понятно, что необходимо удалить экраны ? и *. Тем не менее я ничего не сделал, например, используя \*

ответ

0

Попробуйте.,.

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

Нужно несколько, один как вы в строке sql, второй для расширенного запроса синтаксиса.

Если вы также пишете его как строку на языке, таком как php, может понадобиться больше цитаты, чтобы убежать в строке php.

Можно также просто удалить их из запроса, они только синтаксис в запросе, поэтому не нужно изменять данные.

(Alough немного более сложным, если с помощью phrase_boundary)

+0

Начало здесь: 'где MATCH ('" Включает стороны \\? "')' Это не возвращает 'work from home? ', Но возвращает любую' работу из дома', за которой следует символ, например. 'работа из дома''. – user3649739

+0

Что касается удаления из запроса, я попробовал 'where MATCH ('" Включает стороны Yes "')', предполагая, что они никогда не индексировались, но это тоже ошибка. Трудно решить, поскольку в теории я мог бы просто «Включать стороны?», Если бы это был какой-нибудь символ, НО? – user3649739

+0

На данный момент я просто сделал «Включает стороны»! ((«Включает стороны» NEAR/2 «Нет») («Включает стороны» >> «Нет»)). – user3649739

0

Ну я попробовал # решений, которые не работали:

  1. Я добавил regexp_ в конфигурации для отображения ?=>qmark и *=>asterisk. У меня не было никакой удачи с этим, независимо от того, как я искал ИЭ Includes sidesqmark и Includes sides qmark (последний предполагая? Рассматривается как отдельная работа

  2. Я прокомментировал регулярному_выражению обратно и пытался искать на Includes Sides No на логике, что ? и * не индексируется так что эти пространства не существует.

  3. Я добавил разнесены между Includes sides и No при условии, что один или более символов не индексировать, но каким-то образом занимая голец пространство, например Includes sides No.

  4. Я добавил двойные escape-последовательности, как мне было предложено `` Включает стороны \? \ * \ * \ * No ", которые тоже не удались.

Ничего из этого не произошло.

Я пытался делать NEAR/и >> вместе и работали:

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

который казался неуклюжим.

Наконец я это сделал, который работал

"Includes sides \\*"No" 

который работает, но является общей для меня загадка, почему, хотя я отправляю его, так как он решает эту проблему. Я надеюсь, что кто-то может объяснить механизмы за этим:

  • Очевидно, что \\ это правильный путь, чтобы избежать в sphinxql
  • Очевидно, спасаясь звездочку работает
  • Очевидно Ускользающий ? не
  • Тем не менее, если нужно экранировать, то звездочка, как пришли:

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

не работает и

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

не работает? Если он не индексирует/не распознает ?, но явно является *, тогда мне нужно будет избежать двух после Includes. Тем не менее, это не так, как ?, так и * после Includes, но asterisk до No.

Извините, что поставил вопрос в ответ, но мое решение сработало. Если есть лучший способ для меня как предоставить решение, которое я использовал, так и вопрос, который он раскрыл, пожалуйста, дайте мне знать, поскольку я пытаюсь не путать проблему здесь.

+0

Вы проверили, используете ли вы 'phrase_boundary'? если у вас там '?', это осложнит совпадение фразы. Также проверьте, если? и * находятся в charset_table. В вашем случае по-прежнему рекомендую им НЕ находиться в charset_table. – barryhunter