2016-05-28 10 views
0

Ich versuche, einen Text zu finden Config Migration von ASA5505 8.2 zu ASA5516 in Spalte TITLE.Wie genau Text in Lucene Suche übereinstimmen?

Mein Programm sieht so aus.

Directory directory = FSDirectory.open(indexDir); 

MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_35,new String[] {"TITLE"}, new StandardAnalyzer(Version.LUCENE_35));   
IndexReader reader = IndexReader.open(directory); 
IndexSearcher searcher = new IndexSearcher(reader);  
queryParser.setPhraseSlop(0); 
queryParser.setLowercaseExpandedTerms(true); 
Query query = queryParser.parse("TITLE:Config migration from ASA5505 8.2 to ASA5516"); 
System.out.println(queryStr); 
TopDocs topDocs = searcher.search(query,100); 
System.out.println(topDocs.totalHits); 
ScoreDoc[] hits = topDocs.scoreDocs; 
System.out.println(hits.length + " Record(s) Found"); 
for (int i = 0; i < hits.length; i++) { 
    int docId = hits[i].doc; 
    Document d = searcher.doc(docId); 
    System.out.println("\"Title :\" " +d.get("TITLE")); 
} 

Aber seine

"Title :" Config migration from ASA5505 8.2 to ASA5516 
"Title :" Firewall migration from ASA5585 to ASA5555 
"Title :" Firewall migration from ASA5585 to ASA5555 

Zweite 2 Ergebnisse Rückkehr sind nicht expected.So welche Änderung erforderlich von genauen Text Config Migration übereinstimmen ASA5505 8,2 bis ASA5516

Und meine Indexierfunktion Aussehen so

public class Lucene { 
public static final String INDEX_DIR = "./Lucene"; 
private static final String JDBC_DRIVER = "oracle.jdbc.OracleDriver"; 
private static final String CONNECTION_URL = "jdbc:oracle:thin:xxxxxxx" 

private static final String USER_NAME = "localhost"; 
private static final String PASSWORD = "localhost"; 
private static final String QUERY = "select * from TITLE_TABLE"; 

public static void main(String[] args) throws Exception { 
    File indexDir = new File(INDEX_DIR); 
    Lucene indexer = new Lucene(); 
    try { 
     Date start = new Date(); 
     Class.forName(JDBC_DRIVER).newInstance(); 
     Connection conn = DriverManager.getConnection(CONNECTION_URL, USER_NAME, PASSWORD); 
     SimpleAnalyzer analyzer = new SimpleAnalyzer(Version.LUCENE_35); 
     IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_35, analyzer); 
     IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir), indexWriterConfig); 
     System.out.println("Indexing to directory '" + indexDir + "'..."); 
     int indexedDocumentCount = indexer.indexDocs(indexWriter, conn); 
     indexWriter.close(); 
     System.out.println(indexedDocumentCount + " records have been indexed successfully"); 
     System.out.println("Total Time:" + (new Date().getTime() - start.getTime())/(1000)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

int indexDocs(IndexWriter writer, Connection conn) throws Exception { 
    String sql = QUERY; 
    Statement stmt = conn.createStatement(); 
    stmt.setFetchSize(100000); 
    ResultSet rs = stmt.executeQuery(sql); 
    int i = 0; 
    while (rs.next()) { 
     System.out.println("Addind Doc No:" + i); 
     Document d = new Document(); 
     System.out.println(rs.getString("TITLE")); 
     d.add(new Field("TITLE", rs.getString("TITLE"), Field.Store.YES, Field.Index.ANALYZED)); 
     d.add(new Field("NAME", rs.getString("NAME"), Field.Store.YES, Field.Index.ANALYZED)); 
     writer.addDocument(d); 
     i++; 
    } 
    return i; 
} 
} 

Antwort

0

Versuchen PhraseQuery wie folgt:

BooleanQuery mainQuery= new BooleanQuery(); 
String searchTerm="config migration from asa5505 8.2 to asa5516"; 
String strArray[]= searchTerm.split(" "); 
for(int index=0;index<strArray.length;index++) 
{ 
    PhraseQuery query1 = new PhraseQuery(); 
    query1.add(new Term("TITLE",strArray[index])); 
    mainQuery.add(query1,BooleanClause.Occur.MUST); 
} 

Und dann die mainQuery auszuführen.

Auschecken this Thread von Stackoverflow, kann es Ihnen helfen, PhraseQuery für die genaue Suche zu verwenden.

+0

Keine Ergebnisse gefunden. –

+1

So funktioniert das Erstellen eines 'PhraseQuery' nicht. Sie müssen Ihre Terme separat zur Abfrage hinzufügen ('query.add (neuer Term (" Title "," config "); query.add (neuer Term (" Title "," migration "); ...'). Da es manuell erstellt wird, benötigen Sie keinen Analyzer, auf den Sie sich verlassen können. – femtoRgon

+0

Wie kann ich eine exakte Übereinstimmung herstellen? –

0

PVR ist korrekt, dass die Verwendung einer Phrasenabfrage hier wahrscheinlich die richtige Lösung ist, aber sie verpassten die Verwendung der PhraseQuery Klasse. Sie verwenden bereits QueryParser obwohl, so dass nur die Abfrage-Parser Syntax verwenden, indem Sie Text in Anführungszeichen suchen umschließenden:

Query query = queryParser.parse("TITLE:\"Config migration from ASA5505 8.2 to ASA5516\""); 

Basierend auf Ihrem Update Sie einen anderen Analysator bei Index-Zeit verwendet und Abfrage- Zeit. SimpleAnalyzer und StandardAnalyzer nicht die gleichen Dinge tun. Wenn Sie nicht einen guten Grund haben, etwas anderes zu tun, sollten Sie beim Indexieren und Abfragen genauso vorgehen.

Also, ändern Sie den Analysator in Ihrem Indexierungscode auf StandardAnalyzer (oder umgekehrt, verwenden Sie SimpleAnalyzer bei der Abfrage), und Sie sollten bessere Ergebnisse sehen.

+0

Noch kein Ergebnis. Suchtext wird wie folgt in Kleinbuchstaben konvertiert ** TITEL: "Konfigurationsmigration von asa5505 8.2? Asa5516 **. Von wo **? ** kommt? –

+0

Das? Steht für ein entferntes Stoppwort und wird für StandardAnalyzer erwartet. Dies funktioniert in Ich würde sehen, wie das Feld indiziert wird, welcher Analysator dort benutzt wird usw. – femtoRgon

+0

Meine Frage wurde mit dem INDEX-Code aktualisiert .. –

0

Hier ist, was ich habe für Sie geschrieben, die perfekt funktioniert:

USE: queryParser.parse("\"Config migration from ASA5505 8.2 to ASA5516\"");

  1. So erstellen Indizes

    public static void main(String[] args) 
    { 
    
        IndexWriter writer = getIndexWriter(); 
        Document doc = new Document(); 
        Document doc1 = new Document(); 
        Document doc2 = new Document(); 
        doc.add(new Field("TITLE", "Config migration from ASA5505 8.2 to ASA5516",Field.Store.YES,Field.Index.ANALYZED)); 
        doc1.add(new Field("TITLE", "Firewall migration from ASA5585 to ASA5555",Field.Store.YES,Field.Index.ANALYZED)); 
        doc2.add(new Field("TITLE", "Firewall migration from ASA5585 to ASA5555",Field.Store.YES,Field.Index.ANALYZED)); 
        try 
        { 
         writer.addDocument(doc); 
         writer.addDocument(doc1); 
         writer.addDocument(doc2); 
         writer.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
    } 
    
    public static IndexWriter getIndexWriter() 
    { 
        IndexWriter indexWriter=null; 
    
        try 
        { 
        File file=new File("D://index//"); 
        if(!file.exists()) 
         file.mkdir(); 
        IndexWriterConfig conf=new IndexWriterConfig(Version.LUCENE_34, new StandardAnalyzer(Version.LUCENE_34)); 
        Directory directory=FSDirectory.open(file); 
        indexWriter=new IndexWriter(directory, conf); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        return indexWriter; 
    } 
    

    }

2. Zu se Bogenkette

public static void main(String[] args) 
    { 

    IndexReader reader=getIndexReader(); 

    IndexSearcher searcher = new IndexSearcher(reader); 

    QueryParser parser = new QueryParser(Version.LUCENE_34, "TITLE" ,new StandardAnalyzer(Version.LUCENE_34)); 

    Query query; 
    try 
    { 
    query = parser.parse("\"Config migration from ASA5505 8.2 to ASA5516\""); 

    TopDocs hits = searcher.search(query,3); 

    ScoreDoc[] document = hits.scoreDocs; 
    int i=0; 
    for(i=0;i<document.length;i++) 
    { 
     Document doc = searcher.doc(i); 

     System.out.println("TITLE=" + doc.get("TITLE")); 
    } 
     searcher.close(); 

    } 
    catch (Exception e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
      } 

public static IndexReader getIndexReader() 
{ 
    IndexReader reader=null; 

    Directory dir; 
    try 
    { 
     dir = FSDirectory.open(new File("D://index//")); 
     reader=IndexReader.open(dir); 
    } catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return reader; 
} 
+0

Erhalten Sie das Ergebnis? Können Sie print-Anweisung vor TopDocs hinzufügen hits = searcher.search (query, 3); –

+0

Ja, es gibt exaktes Übereinstimmungsdokument. Wenn ich die Abfrage drucke, wird es sei wie folgt: TITEL: "Config Migration von asa5505 8.2? asa5516 " – PVR

+0

Aber was ist mit case sensitive part? Ich wollte genau übereinstimmen. –