2011-04-03 14 views
7

मैं ल्यूसीन में सटीक वाक्यांश खोजने के लिए स्पैनटर्म क्वेरी का उपयोग कर रहा हूं। लेकिन यह काम नहीं लग रहा है। मेरा कोड यहाँ है।ल्यूसीन का उपयोग कर सटीक वाक्यांश खोज?

अनुक्रमण

IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), false,IndexWriter.MaxFieldLength.UNLIMITED); 
doc.add(new Field("contents", sb.toString(), Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS)); 
doc.add(new Field("imageid", imageDocument.getImageId(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
doc.add(new Field("title", imageDocument.getTitle(), Field.Store.YES, Field.Index.ANALYZED)); 
doc.add(new Field("country", imageDocument.getCountry(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
write.addDocument(doc); 

सर्च कर रहे हैं

String sentence = searchParameters.get("searchExactWord"); 
String[] words = sentence.split(" "); 
String queryNoWord = ""; 
int i = 0; 
SpanTermQuery [] clause = new SpanTermQuery[words.length]; 
for (String word : words) 
{ 
    clause[i] = new SpanTermQuery(new Term("contents",word)); 
    i++; 
} 
SpanNearQuery query = new SpanNearQuery(clause, 0, true); 
booleanQuery.add(query, BooleanClause.Occur.MUST); 

कृपया मुझे मार्गदर्शन अगर मैं गलत कर रहा हूँ ???

प्रतीक

+0

उपयोग एक अलग मानक एक के अलावा अन्य विश्लेषक, यह आम शब्द, keywordanalyzer आप इस पर गौर करेगा .. – Narayan

उत्तर

9

एक PhraseQuery बजाय का प्रयास करें:

PhraseQuery query = new PhraseQuery(); 
String[] words = sentence.split(" "); 
for (String word : words) { 
    query.add(new Term("contents", word)); 
} 
booleanQuery.add(query, BooleanClause.Occur.MUST); 

संपादित करें: मुझे लगता है कि आप एक अलग समस्या है। आपके booleanQuery पर अन्य भाग क्या हैं?

public class LucenePhraseQuery { 
    public static void main(String[] args) throws Exception { 
     // setup Lucene to use an in-memory index 
     Directory directory = new RAMDirectory(); 
     Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); 
     MaxFieldLength mlf = MaxFieldLength.UNLIMITED; 
     IndexWriter writer = new IndexWriter(directory, analyzer, true, mlf); 

     // index a few documents 
     writer.addDocument(createDocument("1", "foo bar baz")); 
     writer.addDocument(createDocument("2", "red green blue")); 
     writer.addDocument(createDocument("3", "test foo bar test")); 
     writer.close(); 

     // search for documents that have "foo bar" in them 
     String sentence = "foo bar"; 
     IndexSearcher searcher = new IndexSearcher(directory); 
     PhraseQuery query = new PhraseQuery(); 
     String[] words = sentence.split(" "); 
     for (String word : words) { 
      query.add(new Term("contents", word)); 
     } 

     // display search results 
     TopDocs topDocs = searcher.search(query, 10); 
     for (ScoreDoc scoreDoc : topDocs.scoreDocs) { 
      Document doc = searcher.doc(scoreDoc.doc); 
      System.out.println(doc); 
     } 
    } 

    private static Document createDocument(String id, String content) { 
     Document doc = new Document(); 
     doc.add(new Field("id", id, Store.YES, Index.NOT_ANALYZED)); 
     doc.add(new Field("contents", content, Store.YES, Index.ANALYZED, 
       Field.TermVector.WITH_POSITIONS_OFFSETS)); 
     return doc; 
    } 
} 
+0

उदाहरण के लिए धन्यवाद छोड़ देता है। यह एक बहुत मददगार थी :) –

+0

क्या यह http://stackoverflow.com/questions/15074812/lucene-search-on-a-hibernate-list-field का समाधान भी होगा? – theblang

2

संस्करण 4.6.0 अनुक्रमण के लिए::

IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_46,analyzer); 
try { 
     IndexWriter iwriter=new IndexWriter(mDir,config); 
     iwriter.deleteAll(); 
     iwriter.commit(); 
     Document doc = new Document(); 

     doc.add(new Field(myfieldname,text,TextField.TYPE_STORED)); 
     iwriter.addDocument(doc); 
     iwriter.close(); 
} 

सटीक वाक्यांश के लिए खोज (चर कीवर्ड में दी गई):

DirectoryReader ireader=DirectoryReader.open(mDir); 
IndexSearcher isearcher=new IndexSearcher(ireader); 
QueryParser parser = new QueryParser(Version.LUCENE_46,myfieldname,analyzer); 
parser.setDefaultOperator(QueryParser.Operator.AND); 
parser.setPhraseSlop(0); 
Query query=parser.createPhraseQuery(myfieldname,keyword); 
ScoreDoc[] hits=isearcher.search(query, null, 1000).scoreDocs; 
nret=hits.length; 
ireader.close(); 

यहाँ एक वाक्यांश के लिए खोज का एक पूरा काम कर उदाहरण दिया गया है "SetPhraseSlop (0) के उपयोग के लिए नोट करें और createPhraseQuery()

2

लुसीन क्वेरी बिल्डर का उपयोग करें, और dou दें खोज स्ट्रिंग के चारों ओर ब्ली उद्धरण। यह सटीक वाक्यांश खोज के लिए काम करता है।

संदर्भ: http://www.lucenetutorial.com/lucene-query-builder.html

संबंधित मुद्दे