2013-10-07 8 views
0

J'utilise les classes démo IndexFiles et SearchFiles pour indexer et rechercher qui sont dans le paquet org.apache.lucene.demo.Lucene: les correspondances exactes ne sont pas affichées en premier

Mon problème est lorsque j'utilise une requête qui contient plus d'un mot, je ne reçois pas les résultats qui correspondent exactement. Par exemple:

Enter query: 
"natural language" 
Searching for: "natural language" 
298 total matching documents 
1. download\researchers.uq.edu.au\fields-of-research\natural-language-processing 
.txt 
2. download\researchers.uq.edu.au\research-project\16267.txt 
3. download\researchers.uq.edu.au\research-project\16279.txt 
4. download\researchers.uq.edu.au\research-project\18361.txt 
5. download\www.uq.edu.au\news\%3Farticle%3D2187.txt 
6. download\researchers.uq.edu.au\researcher\2115.txt 
7. download\ceit.uq.edu.au\content\2013-2014-summer-research-scholarship-project 
s-dr-alan-cody%3Fpage%3D1.txt 
8. download\ceit.uq.edu.au\content\2013-2014-summer-research-scholarship-project 
s-dr-alan-cody%3Fpage%3D2.txt 
9. download\ceit.uq.edu.au\content\2013-2014-summer-research-scholarship-project 
s-dr-alan-cody.txt 
10. download\www.ceit.uq.edu.au\content\2013-2014-summer-research-scholarship-pr 
ojects-dr-alan-cody.txt 
Press (n)ext page, (q)uit or enter number to jump to a page. 

n'a pas même résultat que:

Enter query: 
natural language 
Searching for: natural language 
54307 total matching documents 
1. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D190.txt 

2. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D576.txt 

3. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D46.txt 
4. download\espace.library.uq.edu.au\view\UQ%3A166163.txt 
5. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D108.txt 

6. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D70.txt 
7. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D708.txt 

8. download\researchers.uq.edu.au\fields-of-research\natural-language-processing 
.txt 
9. download\researchers.uq.edu.au\research-project\16267.txt 
10. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D117.tx 
t 
Press (n)ext page, (q)uit or enter number to jump to a page. 

Par exemple, le premier document correspondant ne contient même pas le mot clé « langue ».

Si j'utilise la méthode explain() au sein IndexSearcher classe je reçois ce résultat pour le 1er un:

1. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D190.txt 
0.70643383 = (MATCH) sum of: 
    0.5590494 = (MATCH) weight(contents:natural in 62541) [DefaultSimilarity], result of: 
    0.5590494 = score(doc=62541,freq=4.0 = termFreq=4.0 
), product of: 
     0.8091749 = queryWeight, product of: 
     4.4216847 = idf(docFreq=13111, maxDocs=401502) 
     0.18300149 = queryNorm 
     0.6908882 = fieldWeight in 62541, product of: 
     2.0 = tf(freq=4.0), with freq of: 
      4.0 = termFreq=4.0 
     4.4216847 = idf(docFreq=13111, maxDocs=401502) 
     0.078125 = fieldNorm(doc=62541) 
    0.1473844 = (MATCH) weight(contents:language in 62541) [DefaultSimilarity], result of: 
    0.1473844 = score(doc=62541,freq=1.0 = termFreq=1.0 
), product of: 
     0.5875679 = queryWeight, product of: 
     3.2107275 = idf(docFreq=44012, maxDocs=401502) 
     0.18300149 = queryNorm 
     0.25083807 = fieldWeight in 62541, product of: 
     1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
     3.2107275 = idf(docFreq=44012, maxDocs=401502) 
     0.078125 = fieldNorm(doc=62541) 

Si je clique sur suivant et trouver un tel résultat:

19. download\www.uq.edu.au\news\%3Farticle%3D2187.txt 
0.47449595 = (MATCH) sum of: 
    0.2795247 = (MATCH) weight(contents:natural in 35173) [DefaultSimilarity], result of: 
    0.2795247 = score(doc=35173,freq=4.0 = termFreq=4.0 
), product of: 
     0.8091749 = queryWeight, product of: 
     4.4216847 = idf(docFreq=13111, maxDocs=401502) 
     0.18300149 = queryNorm 
     0.3454441 = fieldWeight in 35173, product of: 
     2.0 = tf(freq=4.0), with freq of: 
      4.0 = termFreq=4.0 
     4.4216847 = idf(docFreq=13111, maxDocs=401502) 
     0.0390625 = fieldNorm(doc=35173) 
    0.19497125 = (MATCH) weight(contents:language in 35173) [DefaultSimilarity], result of: 
    0.19497125 = score(doc=35173,freq=7.0 = termFreq=7.0 
), product of: 
     0.5875679 = queryWeight, product of: 
     3.2107275 = idf(docFreq=44012, maxDocs=401502) 
     0.18300149 = queryNorm 
     0.33182758 = fieldWeight in 35173, product of: 
     2.6457512 = tf(freq=7.0), with freq of: 
      7.0 = termFreq=7.0 
     3.2107275 = idf(docFreq=44012, maxDocs=401502) 
     0.0390625 = fieldNorm(doc=35173) 

quelle page lui-même contient le mot-clé exact "langage naturel". Donc mes questions sont:

1) Pourquoi Lucene n'affiche pas les correspondances exactes en premier?

2) Pourquoi Lucene affiche un résultat qui ne contient même pas de mot-clé?

3) Où/comment puis-je changer cela pour qu'il affiche d'abord ceux qui correspondent exactement et ceux qui sont plus pertinents?

Répondre

0

1 - Il n'est pas destiné à. Voir la documentation au Lucene query syntax. La requête natural language est une requête composée de deux termes. À eux seuls, Lucene n'a aucune préférence pour que les termes soient rapprochés. Si vous voulez trouver des correspondances exactes, une requête de phrase est la bonne approche, comme "natural language"

2 - Les deux résultats dont vous avez inclus un explaination ne contiennent des correspondances pour les deux termes, voir:

0.2795247 = (MATCH) weight(contents:natural in 35173) [DefaultSimilarity], result of: 
    0.2795247 = score(doc=35173,freq=4.0 = termFreq=4.0 
... 
0.19497125 = (MATCH) weight(contents:language in 35173) [DefaultSimilarity], result of: 
    0.19497125 = score(doc=35173,freq=7.0 = termFreq=7.0 

Selon Lucene, il a trouvé le terme "naturel" 4 fois dans ce document, et "langue" 7 fois, dans le champ de contenu (que je suppose être votre champ par défaut).

3 - Regardez par-dessus la syntaxe de l'analyseur de requête, pour voir ce qui vous semble le plus logique. Il semble que vous pourriez trouver Proximity Searches utile.

Si vous voulez juste simplement obtenir correspondances de phrases suivies par d'autres, vous pouvez utiliser quelque chose le long des lignes de:

"natural language" natural language 
+0

Merci, mais 'proximité search' trouverait pas réellement les mots séparément. Donc ce n'est pas ce que je suis après –

+0

Bien sûr, c'est pourquoi l'autre approche a été fournie, combinant des requêtes de termes séparés avec une requête de phrase, qui devrait bien servir. Est-ce que ce n'est pas suffisant? – femtoRgon

+0

J'ai déjà pensé qu'en fait, mais pour des requêtes plus grandes disons même pour 4 mots-clés, j'aurais 3 requêtes qui seraient composées de 2 mots, 2 requêtes qui sont 3 mots, et la requête elle-même. J'ai développé un algorithme pour trouver des sous-requêtes qui prend le temps O (n^3), donc pas si bon si vous considérez une requête de 10 mots-clés. Je me demandais s'il était possible de combiner Proximity Search avec la recherche par défaut? –

Questions connexes