2010-06-25 4 views
0

ci-dessous sont des tableaux que je dois index dans Sphinx alt textbesoin de conseils sur la configuration de la requête et l'index Sphinx

Nouvelles a de nombreux projets qui lui sont liés par la table news_projects ...

Ma question est-il conseillé de avez-vous tous les noms de projet dans un champ de texte pour pouvoir effectuer une recherche?

C'est ma requête:

//query to get the project names and make all project names appear in one field separated by comma. 
SELECT 
    news.id 
    news.headline, 
    news.body, 
GROUP_CONCAT(DISTINCT projects.project_name) as related_projects 
FROM news 
LEFT JOIN news_projects on news.id = news_projects.news_id 
LEFT JOIN projects on news_projects.project_id = projects.id 
GROUP BY news.id 

Cela lignes de sortie puis avec colonne project_name formaté comme « nom, nom2, NAME3 »

Im un peu temps indécis à utiliser ou tout simplement faire le project_id un attribut .. Avoir le nom de projet comme texte est certainement d'une grande aide car il peut être recherché sur ...

S'il vous plaît .. J'ai besoin de votre opinion sur ce .. merci beaucoup!

+0

Est-ce une question de sphinx ou de sphinx pensant? Il est marqué comme pensant-sphinx mais semble être sur le sphinx droit? –

+0

Juste sphinx .. J'ai déjà enlevé la balise sphinx pensante ... – r2b2

+0

ceci n'est pas lié à votre question, mais vous n'avez pas besoin de [id] dans la table news_projects. Vous avez juste besoin de PRIMARY (news_id, project_id) – Rafa

Répondre

1

Si le nom du projet est utile pour la recherche, alors conservez-le définitivement. Je recommanderais de concaténer avec un espace au lieu d'une virgule, bien que (bien que cela ne soit pas important sous le capot pour Sphinx lorsque vous utilisez les paramètres par défaut).

Il est probablement également utile d'avoir les ID de projet en tant qu'attributs à valeurs multiples (MVA) - ce qui signifie que vous pouvez limiter les résultats de la recherche aux éléments d'actualité dans un projet spécifique. Pas de raison de ne pas avoir les deux, vraiment.

+0

Avoir des ids de projets entiers donne aussi de meilleurs résultats, simplement parce que vous ne correspondez pas à une chaîne. –

+0

En effet, mais cela dépend de ce que vous voulez faire: limiter les résultats de recherche à des projets spécifiques (utiliser le MVA pour les identifiants de projet) ou inclure des noms de projets dans le texte correspondant aux requêtes de recherche. – pat

1

Vous pouvez également spécifier le champ related_projects avec sql_joined_field. Cela peut être plus rapide car vous pouvez supprimer le regroupement de la requête principale.

sql_query = SELECT id, headline, body FROM news 

sql_joined_field = related_projects from query; \ 
    SELECT news_projects.news_id, projects.project_name \ 
    FROM news_projects \ 
    JOIN projects ON projects.id = news_projects.project_id \ 
    ORDER BY news_projects.news_id ASC 

Si vous faites des index delta, cependant, vous devrez copier les conditions delta à tous les champs joints (même avec des requêtes à distance), qui peut être un peu d'une douleur.

+0

Cela aurait dû être marqué comme la réponse. +1 – patrickn