我目前有两个表:

search_matches:

match_id (int) <-- primary key
parent_id (int) <-- foreign-key
word_id (int) <-- foreign-key (to a table filled with words that are unique and have an id)
pos (int) <-- the position of the word in the block of text it comes from

search_words :(更新)

word_id (int) <-- primary key
word (varchar ...) <-- the word

(我使用的是innodb,并且我的主机不会升级mysql,因此全文不可用)

我希望用户可以使用“。”,以便他们可以搜索“ foo bar”。

我已经想到了几种方法,但是最不密集的方法似乎是添加了另一列:

next_pos (int)

然后我可以做

(SELECT * FROM table WHERE word_id='foo') as foo
INNER JOIN (SELECT * FROM table WHERE word_id='bar') AS bar 
ON (
  foo.parent_id=bar.parent_id AND
  foo.next_pos=bar.next_pos
)

它以存储额外的列和每个单词之外的每个单词的内部联接为代价,但这是我到目前为止提出的最佳选择。 (之前的想法是减少一列,但是需要在ON块内进行加法运算,我认为随着网站的发展,这可能会变得过于昂贵。

这是我最好的选择,还是那里还有其他选择? 我仍然只是在舞台上玩,所以现在是时候进行更改了。


更新1:

我现在正在考虑使用关键字表来缩小搜索范围,然后在其上使用like而不是多个联接,因为这可能更快,并且极大地消除了对联接的需要。 在我的整个数据库上做一个赞只是没有效果。

===============>>#1 票数:0

我真的不明白您为什么要完成所有这些手动工作。 有一些工具可以简单地完成它。 根据我的阅读,您想要做的事情与全文搜索有关。 您不需要自己建立索引。

您是否考虑过使用SolR之类的东西? 只要您创建索引,它就可以与任何类型的数据库一起很好地工作。

===============>>#2 票数:-1

我看不到您将如何使用当前设置进行搜索。 如果您说有一个表,其中仅包含一个文本块中的UNIQUE单词,那么您如何期望将唯一单词的列表与整个内容中的实际单词位置相关联? 例如,说原始内容看起来像这样:

some text with foo and also with foo bar

您会使用独特的单词表吗?

word_id   word
--------------
1         some
2         text
3         with
4         foo
5         and
6         also
7         bar

如果是这样,您将如何查找foobar作为相邻记录?

我假设您的数据库在某处也有完整的内容,那么为什么不只使用LIKE搜索内容呢?

  ask by Kirk translate from so

未解决问题?本站智能推荐: