2016-09-04 13 views
9

के बाद लुसीन में काम नहीं कर रहा है वर्तमान में मैं अपने आवेदन में ल्यूसीन का उपयोग कर ऑटो सुझाव भाग पर काम कर रहा हूं। शब्दों का ऑटो सुझाव कंसोल एप्लिकेशन में ठीक काम कर रहा है लेकिन अब मैंने वेब एप्लिकेशन से पूर्णांक किया है लेकिन यह वांछित तरीके से काम नहीं कर रहा है।ऑटो सुझाव पहली खोज पुनरावृत्ति

जब दस्तावेज़ कुछ खोजशब्दों के साथ पहली बार खोज करते हैं तो खोज और ऑटो सुझाव दोनों ठीक काम कर रहे हैं और परिणाम दिखा रहे हैं। लेकिन जब मैं किसी अन्य कीवर्ड या एक ही कीवर्ड के लिए फिर से खोज करता हूं तो ऑटो सुझाव के साथ-साथ खोज परिणाम दोनों दिखाई नहीं दे रहे हैं। मैं यह समझने में सक्षम नहीं हूं कि यह अजीब परिणाम क्यों आ रहा है।

final int HITS_PER_PAGE = 20; 

final String RICH_DOCUMENT_PATH = "F:\\Sample\\SampleRichDocuments"; 
final String INDEX_DIRECTORY = "F:\\Sample\\LuceneIndexer"; 

String searchText = request.getParameter("search_text"); 

BooleanQuery.Builder booleanQuery = null; 
Query textQuery = null; 
Query fileNameQuery = null; 

try { 
    textQuery = new QueryParser("content", new StandardAnalyzer()).parse(searchText); 
    fileNameQuery = new QueryParser("title", new StandardAnalyzer()).parse(searchText); 
    booleanQuery = new BooleanQuery.Builder(); 
    booleanQuery.add(textQuery, BooleanClause.Occur.SHOULD); 
    booleanQuery.add(fileNameQuery, BooleanClause.Occur.SHOULD); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 


Directory index = FSDirectory.open(new File(INDEX_DIRECTORY).toPath()); 
IndexReader reader = DirectoryReader.open(index); 

IndexSearcher searcher = new IndexSearcher(reader); 
TopScoreDocCollector collector = TopScoreDocCollector.create(HITS_PER_PAGE); 

try{ 
    searcher.search(booleanQuery.build(), collector); 
     ScoreDoc[] hits = collector.topDocs().scoreDocs; 

    for (ScoreDoc hit : hits) { 
     Document doc = reader.document(hit.doc); 
    } 

    // Auto Suggestion of the data 

    Dictionary dictionary = new LuceneDictionary(reader, "content"); 
    AnalyzingInfixSuggester analyzingSuggester = new AnalyzingInfixSuggester(index, new StandardAnalyzer()); 
    analyzingSuggester.build(dictionary); 

    List<LookupResult> lookupResultList = analyzingSuggester.lookup(searchText, false, 10); 
    System.out.println("Look up result size :: "+lookupResultList.size()); 
    for (LookupResult lookupResult : lookupResultList) { 
     System.out.println(lookupResult.key+" --- "+lookupResult.value); 
    } 

    analyzingSuggester.close(); 
    reader.close(); 

}catch(IOException e){ 
    e.printStackTrace(); 
} 

पूर्व के लिए:: पहले यात्रा में अगर मैं शब्द "नमूना" के लिए खोज

  • ऑटो सुझाव मुझे देता है

    ऑटो सुझाव और साथ ही खोज के लिए के टुकड़े इस प्रकार हैं परिणाम: नमूना, नमूने, नमूना इत्यादि। (ये दस्तावेजों में शब्द हैं)

  • खोज परिणाम: नमूना

लेकिन अगर मैं इसे एक ही पाठ या अलग से फिर से खोजता हूं तो यह कोई परिणाम नहीं दिखा रहा है और LookUpResult सूची का आकार शून्य आ रहा है।

मुझे यह नहीं मिल रहा है कि यह क्यों हो रहा है। कृपया

नीचे दस्तावेज़ों के सेट से इंडेक्स निर्माण के लिए अद्यतन कोड है।

final String INDEX_DIRECTORY = "F:\\Sample\\LuceneIndexer"; 
long startTime = System.currentTimeMillis(); 
List<ContentHandler> contentHandlerList = new ArrayList<ContentHandler> (); 

String fileNames = (String)request.getAttribute("message"); 

File file = new File("F:\\Sample\\SampleRichDocuments"+fileNames); 

ArrayList<File> fileList = new ArrayList<File>(); 
fileList.add(file); 

Metadata metadata = new Metadata(); 

// Parsing the Rich document set with Apache Tikka 
ContentHandler handler = new BodyContentHandler(-1); 
ParseContext context = new ParseContext(); 
Parser parser = new AutoDetectParser(); 
InputStream stream = new FileInputStream(file); 

try { 
    parser.parse(stream, handler, metadata, context); 
    contentHandlerList.add(handler); 
}catch (TikaException e) { 
    e.printStackTrace(); 
}catch (SAXException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
finally { 
    try { 
     stream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

FieldType fieldType = new FieldType(); 
fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS); 
fieldType.setStoreTermVectors(true); 
fieldType.setStoreTermVectorPositions(true); 
fieldType.setStoreTermVectorPayloads(true); 
fieldType.setStoreTermVectorOffsets(true); 
fieldType.setStored(true); 

Analyzer analyzer = new StandardAnalyzer(); 
Directory directory = FSDirectory.open(new  File(INDEX_DIRECTORY).toPath()); 
IndexWriterConfig conf = new IndexWriterConfig(analyzer); 
IndexWriter writer = new IndexWriter(directory, conf); 

Iterator<ContentHandler> handlerIterator = contentHandlerList.iterator(); 
Iterator<File> fileIterator = fileList.iterator(); 

Date date = new Date(); 

while (handlerIterator.hasNext() && fileIterator.hasNext()) { 
Document doc = new Document(); 

String text = handlerIterator.next().toString(); 
String textFileName = fileIterator.next().getName(); 

String fileName = textFileName.replaceAll("_", " "); 
fileName = fileName.replaceAll("-", " "); 
fileName = fileName.replaceAll("\\.", " "); 

String fileNameArr[] = fileName.split("\\s+"); 
for(String contentTitle : fileNameArr){ 
    Field titleField = new Field("title",contentTitle,fieldType); 
    titleField.setBoost(2.0f); 
    doc.add(titleField); 
} 

if(fileNameArr.length > 0){ 
    fileName = fileNameArr[0]; 
} 

String document_id= UUID.randomUUID().toString(); 

FieldType documentFieldType = new FieldType(); 
documentFieldType.setStored(false); 

Field idField = new Field("document_id",document_id, documentFieldType); 
Field fileNameField = new Field("file_name", textFileName, fieldType); 
Field contentField = new Field("content",text,fieldType); 

doc.add(idField); 
doc.add(contentField); 
doc.add(fileNameField); 

writer.addDocument(doc); 

analyzer.close(); 
} 

writer.commit(); 
writer.deleteUnusedFiles(); 
long endTime = System.currentTimeMillis(); 

writer.close(); 

इसके अलावा मैं देखा है कि सूचकांक निर्देशिका में फ़ाइलों को यात्रा दूसरी खोज से हटा दिया जा रहा है और केवल .segment प्रत्यय के साथ फ़ाइल .segmenta, .segmentb, .segmentc आदि ..

तरह परिवर्तन हो रहा है

मुझे नहीं पता कि यह अजीब स्थिति क्यों हो रही है।

+0

आप मेरा उत्तर देख सकें और अगर यह काम करता है? – coolk

उत्तर

0

आपका कोड बहुत सरल दिखता है। इसलिए, मुझे यह महसूस हो रहा है कि आपको इस समस्या का सामना करना पड़ सकता है क्योंकि आपके इंडेक्स के साथ कुछ गलत हो रहा है, इस बारे में जानकारी प्रदान करना कि आप इंडेक्स बनाने के तरीके के बारे में जानकारी प्रदान कर सकते हैं। लेकिन इस समय सटीक कोड :)

+0

मैंने कोड अपडेट किया है। कृपया इसे देखें। – anand

0

मुझे लगता है कि आपकी समस्या लेखक.deleteUnusedFiles() कॉल के साथ है।

JavaDocs के अनुसार, यह कॉल "अप्रतिबंधित अनुक्रमणिका को हटा सकता है"।

हटाने के लिए कौन सी अनुक्रमणिका IndexDeletionPolicy द्वारा संचालित की जाती है। हालांकि "डिफ़ॉल्ट विलोपन नीति KeepOnlyLastCommitDeletionPolicy है, जो हमेशा एक नई प्रतिबद्धता के साथ पुरानी प्रतिबद्धताओं को हटा देती है (यह 2.2 से पहले व्यवहार से मेल खाती है)।"

यह "अंतिम बंद पर हटाएं" के बारे में भी बात करता है, जिसका अर्थ यह है कि एक बार यह सूचकांक उपयोग और बंद हो जाता है (उदाहरण के दौरान खोज के दौरान), यह सूचकांक हटा दिया जाएगा।

तो आपके पहले खोज परिणाम से मेल खाने वाली सभी इंडेक्स तुरंत हटा दी जाएंगी।

इस प्रयास करें:

IndexWriterConfig conf = new IndexWriterConfig(analyzer); 
conf.setIndexDeletionPolicy(NoDeletionPolicy.INSTANCE); 
+0

मैंने आपके स्निपेट की कोशिश की लेकिन यह अभी भी काम नहीं कर रहा है .. यह अभी भी पुराने तरीके से व्यवहार कर रहा है – anand

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