2

说有一些字符串,比如

sphinxQL> select * from rttest where match('beach');
+------+--------+---------------------------------------------+
| id   | weight | value                                       |
+------+--------+---------------------------------------------+
|   12 |   1576 | looking down on the beach from Beach Street |
|   10 |   1555 | This is a beach                             |
|   11 |   1555 | photo of Beach Street                       |
+------+--------+---------------------------------------------+

如何匹配包含“海滩”的文档,但不是当它只是“海滩街”短语的一部分时。

这类作品:

sphinxQL> select * from rttest where match('beach -"beach street"');
+------+--------+-----------------+
| id   | weight | value           |
+------+--------+-----------------+
|   10 |   1527 | This is a beach |
+------+--------+-----------------+

但理想情况下,我们也应该得到文件 12。因为我们也有自己的海滩。

从海滩街俯瞰海滩

仅排除短语,排除所有包含该短语的文档,无论它们是否也仅匹配单个关键字。

像'NOT NEAR'这样的东西是理想的:

sphinxQL> select * from rttest where match('beach -NEAR/1 street');
ERROR 1064 (42000): index rttest: syntax error, unexpected TOK_NEAR near 'NEAR/1 street'

但由于我们没有,还有其他方法吗?(除了后期处理;)

4

1 回答 1

0

好吧,万一有人发现了这一点,我想出了一个解决方法。发表在狮身人面像论坛上:

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

但是一个快速的总结

select *,weight() MOD 4 AS w from from rttest 
  where match('beach | "beach street" | "beach street" | "beach street" ') 
  and w > 0 order by w desc option ranker=wordcount;

+------+---------------------------------------------+------+
| id   | value                                       | w    |
+------+---------------------------------------------+------+
|   10 | This is a beach                             |    1 |
|   12 | looking down on the beach from Beach Street |    1 |
+------+---------------------------------------------+------+

这包括带有“海滩”的文件,不包括任何只有海滩街”的文件。

(因为“海滩街”匹配所有 4 个术语,4 的倍数被排除在外。如果有一个单一的海滩 - 单独或短语一起,它不再是 4(例如它的 1 或 5),因此仍然包括在内. 取模运算的结果应该是有多少个单字)

于 2013-10-31T20:05:40.463 回答