lucenesearchservice.java

来自「jetspeed源代码」· Java 代码 · 共 687 行 · 第 1/2 页

JAVA
687
字号
        }
        catch(Exception e)
        {
            logger.error("Error trying to add fields to parsed object.", e);
        }
    }
    
    private void addFieldsToMap(Document doc, Set fieldNames, Map fields)
    {
        Iterator fieldIter = fieldNames.iterator();
        while(fieldIter.hasNext())
        {
            String fieldName = (String)fieldIter.next();
            Field[] docFields = doc.getFields(fieldName);
            if(fields != null)
            {
                for(int i=0; i<docFields.length; i++)
                {
                    Field field = docFields[i];
                    if(field != null)
                    {
                        String value = field.stringValue();
                        fields.put(fieldName, value);
                    }
                }
            }
        }
    }

    /**
     * 
     * @return 
     */
    public String[] getSearchSets()
    {
        return null;
    }

    /**
     * 
     * @see org.apache.jetspeed.services.search.SearchService#add(java.lang.Object)
     * @param o
     * @return 
     */
    public boolean add(Object o)
    {
        Collection c = new ArrayList(1);
        c.add(o);

        return add(c);
    }

    /**
     * 
     * @see org.apache.jetspeed.services.search.SearchService#add(java.lang.Collection)
     * @param c
     * @return 
     */
    public boolean add(Collection c)
    {
        boolean result = false;

        IndexWriter indexWriter;
        try
        {
            indexWriter = new IndexWriter(rootDir, new StandardAnalyzer(), false);
        }
        catch (IOException e)
        {
            logger.error("Error while creating index writer. Skipping add...", e);
            return result;
        }

        Iterator it = c.iterator();
        while (it.hasNext()) 
        {
            Object o = it.next();
            // Look up appropriate handler
            ObjectHandler handler = null;
            try
            {
                handler = HandlerFactory.getHandler(o);
            }
            catch (Exception e)
            {
                logger.error("Failed to create hanlder for object " + o.getClass().getName());
                continue;
            }

            // Parse the object
            ParsedObject parsedObject = handler.parseObject(o);

            // Create document
            Document doc = new Document();

            // Populate document from the parsed object
            if (parsedObject.getKey() != null)
            {
                doc.add(Field.Keyword(ParsedObject.FIELDNAME_KEY, parsedObject.getKey()));
            }
            if (parsedObject.getType() != null)
            {
                doc.add(Field.Text(ParsedObject.FIELDNAME_TYPE, parsedObject.getType()));
            }
            if (parsedObject.getTitle() != null)
            {
                doc.add(Field.Text(ParsedObject.FIELDNAME_TITLE, parsedObject.getTitle()));
            }
            if (parsedObject.getDescription() != null)
            {
                doc.add(Field.Text(ParsedObject.FIELDNAME_DESCRIPTION, parsedObject.getDescription()));
            }
            if (parsedObject.getContent() != null)
            {
                doc.add(Field.Text(ParsedObject.FIELDNAME_CONTENT, parsedObject.getContent()));
            }
            if (parsedObject.getLanguage() != null)
            {
                doc.add(Field.Text(ParsedObject.FIELDNAME_LANGUAGE, parsedObject.getLanguage()));   
            }
            if (parsedObject.getURL() != null)
            {
                doc.add(Field.Text(ParsedObject.FIELDNAME_URL, parsedObject.getURL().toString()));
            }
            if(parsedObject.getClassName() != null)
            {
                doc.add(Field.Text(ParsedObject.FIELDNAME_CLASSNAME, parsedObject.getClassName()));
            }

            MultiMap multiKeywords = parsedObject.getMultiKeywords();
            addFieldsToDocument(doc, multiKeywords, KEYWORD);
            
            MultiMap multiFields = parsedObject.getMultiFields();
            addFieldsToDocument(doc, multiFields, TEXT);
            
            Map fields = parsedObject.getFields();
            addFieldsToDocument(doc, fields, TEXT);

            // Add the document to search index
            try
            {
                indexWriter.addDocument(doc);
            }
            catch (IOException e)
            {
               logger.error("Error adding document to index.", e);
            }
            logger.debug("Index Document Count = " + indexWriter.docCount());
            logger.info("Added '" + parsedObject.getTitle() + "' to index");
            result = true;
        }

        try
        {
            indexWriter.optimize();
        }
        catch (IOException e)
        {
            logger.error("Error while trying to optimize index.");
        }
        finally
        {
            try
            {
                indexWriter.close();
            }
            catch (IOException e)
            {
               logger.error("Error while closing index writer.", e);
            }
        }

        return result;
    }
    
    private void addFieldsToDocument(Document doc, Map fields, int type)
    {
        if(fields != null)
        {
            Iterator keyIter = fields.keySet().iterator();
            while(keyIter.hasNext())
            {
                Object key = keyIter.next();
                if(key != null)
                {
                    Object values = fields.get(key);
                    if(values != null)
                    {
                        if(values instanceof Collection)
                        {
                            Iterator valueIter = ((Collection)values).iterator();
                            while(valueIter.hasNext())
                            {
                                Object value = valueIter.next();
                                if(value != null)
                                {
                                    if(type == TEXT)
                                    {
                                        doc.add(Field.Text(key.toString(), value.toString()));
                                    }
                                    else
                                    {
                                        doc.add(Field.Keyword(key.toString(), value.toString()));
                                    }
                                }
                            }
                        }
                        else
                        {
                            if(type == TEXT)
                            {
                                doc.add(Field.Text(key.toString(), values.toString()));
                            }
                            else
                            {
                                doc.add(Field.Keyword(key.toString(), values.toString()));
                            }
                        }
                    }
                }
            } 
        }
    }

    /**
     * 
     * @see org.apache.jetspeed.services.search.SearchService#remove(java.lang.Object)
     * @param o
     * @return 
     */
    public boolean remove(Object o)
    {
        Collection c = new ArrayList(1);
        c.add(o);

        return remove(c);
    }

    /**
     * 
     * @see org.apache.jetspeed.services.search.SearchService#remove(java.lang.Collection)
     * @param c
     * @return 
     */
    public boolean remove(Collection c)
    {
        boolean result = false;

        try 
        {
            IndexReader indexReader = IndexReader.open(this.rootDir);

            Iterator it = c.iterator();
            while (it.hasNext()) 
            {
                Object o = it.next();
                // Look up appropriate handler
                ObjectHandler handler = HandlerFactory.getHandler(o);

                // Parse the object
                ParsedObject parsedObject = handler.parseObject(o);

                // Create term
                Term term = null;

                if (parsedObject.getKey() != null)
                {
                    term = new Term(ParsedObject.FIELDNAME_KEY, parsedObject.getKey());
                    // Remove the document from search index
                    int rc = indexReader.delete(term);
                    logger.info("Attempted to delete '" + term.toString() + "' from index, documents deleted = " + rc);
                    //System.out.println("Attempted to delete '" + term.toString() + "' from index, documents deleted = " + rc);
                    result = rc > 0;
                }
            }

            indexReader.close();

            IndexWriter indexWriter = new IndexWriter(rootDir, new StandardAnalyzer(), false);
            indexWriter.optimize();
            indexWriter.close();

        }
        catch (Exception e)
        {
            logger.error("Exception", e);
            result = false;
        }

        return result;
    }

    /**
     * 
     * @see org.apache.jetspeed.services.search.SearchService#update(java.lang.Object)
     * @param o
     * @return 
     */
    public boolean update(Object o)
    {
        Collection c = new ArrayList(1);
        c.add(o);

        return update(c);
    }
    /**
     * Updates an index entry. For now, it's a remove and add.
     * 
     * @param c
     * @return 
     * @see org.apache.jetspeed.services.search.SearchService#update(java.lang.Collection)
     */
    public boolean update(Collection c)
    {
        boolean result = false;

        try
        {
            // Delete entries from index
            remove(c);
            result = true;
        }
        catch (Throwable e)
        {
            logger.error("Exception",  e);
        }

        try
        {
            // Add entries to index
            add(c);
            result = true;
        }
        catch (Throwable e)
        {
            logger.error("Exception",  e);
        }

        return false;
    }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?