2013-07-05 2 views
0

я создал инвертированный индекс из документов в течение 2-х таблиц:поиска вручную инвертированный индекс

  • index_token (token_id, лексем)
  • index_documents (doc_id, token_id, storage_document_id)

Теперь я хотите выбрать документы, в которых слова «кошка» и «собака» встречаются в одном документе storage_document.

Моя попытка была:

SELECT * FROM index_token INNER JOIN index_documents ON index_token.token_id = index_documents.token_id WHERE index_token.token = 'кошка' И/ИЛИ index_token.token = 'собака'

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

Итак, как мне изменить запрос, чтобы получить ожидаемые результаты?

Он также должен принять более двух ключевых слов.

ответ

1
SELECT dog_docs.doc_id from 
(
SELECT index_documents.doc_id 
FROM index_documents 
INNER JOIN index_token 
ON index_token.token_id = index_documents.token_id 
WHERE index_token.token = 'cat' 
) cat_docs 
INNER JOIN 
(
SELECT index_documents.doc_id 
FROM index_documents 
INNER JOIN index_token 
ON index_token.token_id = index_documents.token_id 
WHERE index_token.token = 'dog' 
) dog_docs 
ON cat_docs.doc_id = dog_docs.doc_id 
+0

да это идет в правильном направлении, но ссылку на документ, который должен быть общим является storage_document_id, doc_id только первичный ключ index_documents – pila

+0

, но мне интересно, если есть более расширяемой решение? поэтому мне нужно добавить целый новый блок INNER JOIN для каждого дополнительного ключевого слова ... не очень приятно, но я думаю, что он работает – pila

Смежные вопросы