Copyright © 2006 Together Teamlösungen EDV-Dienstleistungen GmbH
All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, electronic, mechanical, photocopying, recording or otherwise, without the prior written permission of the Together Teamlösungen EDV-Dienstleistungen GmbH.
Together Teamlösungen EDV-Dienstleistungen GmbH DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Table of Contents
List of Figures
List of Tables
Table of Contents
'Together Search Server' and 'Together Document Viewer' are a fast and lightweight indexing and searching applications designed using 'Together application server' - platform built to handle extreme high volume web sites in an n-tier architecture.
'Together Search Server' and 'Together Document Viewer' are a web applications that can run on virtually any existing web server. The whole applications runs and is managed trough a web browser which limits the system requirements (resources) need to run it on the client side. The installation and configuration on the server side as very simple as well and the whole process takes less than 5 minutes.
'Together Search Server' and 'Together Document Viewer' are written in pure JAVA which guarantees its execution on virtually any OS currently in use. Thanks to its modular design, 'Together Search Server' and 'Together Document Viewer' can be easily extended/upgraded with new features, search and indexing engines etc.
Table of Contents
Accessing the administration for the first time displays the logging dialog. By default the username is “admin” and password is “enhydra”.
Administrative part of the application consists of several modules:
SITES - site management, site path management, site settings, indexing.
ADMINISTRATION - application settings, indexing status, document group, file type mapping
REPORTS
HISTORY – indexing history
Clicking the SITES button on the Administrative main page loads the sites module and displays it in a new web page. Sites operations are listed in web pages middle frame (Sites Bar).
![]() |
The following functionality is available in this module:
LIST - Site Indexing and editing.
PATHS - Editing of paths and path types associated with each site
SETTINGS - Various site setting
FILTERS - Indexing filters management
By default, clicking the SITES button, displays the LIST (Site List) screen in the bottom frame.
Selecting the LIST button in the Site bar displays the Site List page (module) in the bottom frame. Initially, the list of sites is displayed. The following Site management operations are available on this page:
list of sites
index
index all
The following information can be obtained from the List of Sites:
Name - document name
Documents - number of documents indexed in the site
Queries - number of queries (searches) made to this site
Last Updated - the time of last indexing of site index
Options - site management operations
Operations that can be performed over an existing site are displayed in the Options column. Each operation is represented by a button:
Clicking the Index All button indexes all Sites. There is a choice between indexing all Sites at once, or one-by-one (after one is finished the next one is started).
The following attributes are listed on the Site page :
Name – Site name. Must be unique (name per site).
Language – Site language. Used for analyzing and indexing documents
Max. Size (kb) – Maximal size of a file to be indexed in thousands of bytes. If a file is larger than the value specified in this filed, it won’t be indexed.
Max. Age (days) - Maximal age of a file to be indexed in days. If a file is older than the value specified in this filed, it won’t be indexed.
The rest fields are not mandatory.
Search by default – checked automatically includes the site in search
Downloadable – checked allows for downloading of sites files
Index directory – overrides the default IndexDir parameter
Filter database – database where filtered files are stored
Filter table - table where filtered files are stored
Filter column - column where filtered files are stored
Include database – database where included files are stored
Include table - table where included files are stored
Include column - column where included files are stored
Include column modified – document modification time column
Index content – should file content be indexed or just index file name and modification time.
Index directories – directrories will be index.
Index unknown file types – all other file types. These files are not parsed for contents but rather indexed only using their file name and modification time.
Index by group – Choose predefined file group
If the optional attributes Filter database, Filter table, and Filter column were entered for a Site, during indexing files to be indexed will be filtered according to the criteria (file paths) entered in the Filter column.
Filter database is a logical database name. Filter table is a table within the database. Filter column is a column within the table. This is the column where the actual files (file paths) to be filtered are stored.
In order to use the database, a user/administrator should configure ( "filterDB”) in
<together-application-server-runtime-7.0 root>/multiserver/webapps/tssAdmin/WEB-INF/ web.xml
<together-application-server-runtime-7.0 root>/multiserver/conf/catalina/localhost/tssAdmin.xml
If the optional attributes Include database, Include table, Include Column and Include Column Modified were entered for a Site, during indexing files to be indexed will be indexed according to an include list in an external database.
Include database is a logical database name. Include table is a table within the database. Include column is a column within the table containing full file path. This is the column where the actual files (file paths) to be indexed are stored. Metadata key column is a column within the table where the file property keys are stored. Metadata value column is a column within the table where the file property values are stored.
If the optional attributes Metadata database, Metadata table, Metadata File Column, Metadata Key Column and Metadata Value Column were entered for a Site, during indexing and updating files addition information about each file whose reference exists in Metadata database will be indexed, and at the end of the index/update process if the predefined file type 'NULL' is selected to be indexed, Meta Data addition information will be indexed in case that file path of the file from 'Metadata File Column' don`t exists on file system and not have been indexed/updated yet.
If the parameter LogicalNameFromDatabase was set to “1” in the application configuration file, the indexing/update mechanism will try to locate the DocumentLogicalName parameter (also defined as a string value in the configuration file) in the metadata’s key column for the file being indexed. If found the document title is obtained from metadata’s value column corresponding to that key. This value will be then indexed along with other attributes.
If the LogicalNameFromDatabase parameter was set to “0” or no DocumentLogicalName was found among keys in the metadata database, the default mechanism for extracting document title is used.
If parameter 'DocumentUpdate' in the application configuration file was found among keys in the metadata database, modification time is obtained from metadata’s value column corresponding to that key. If the key is not found current time will be used as modification time.
Parameter 'DocumentUpdatePattern' in the application configuration file is used to describe the pattern of the modification time in the metadata’s value column.
Metadata database is a logical database name. Metadata table is a table within the database. Metadata file column is a column within the table. This is the column where the actual files (file paths) to be indexed are stored.
Two mode of indexing are present. Normal and Re-Index mode.
In Normal mode every click on index button will start index process from the beginning.
The main functionality of Re-Index mode is to continue with index process from last indexed file. According to this, index process will create ‘txt’ file (‘include.txt’ or ‘path.txt’, that is placed in index directory of the ‘Site’, together with index files) where will be logged last indexed ‘directory/file’.
After index process is finished, the ‘txt’ file will be deleted. According to this new index process will be started from beginning in Re-Index Mode.
Mode of Index, that application will start is defined in ‘web.xml’ file. Parameter is ‘Indexer.ReIndexMode’ and default value is ‘true’.
Clicking the Indexing button
![]() |
Clicking the Index All button indexes all Sites. There is a choice between indexing all Sites at once, or one-by-one (after one is finished the next one is started).
Clicking the Edit Site button
![]() |
on the Site List screen displays the Site page. This page resembles the Site page. All attributes are explained in the Create Site section.
Selecting the Status option on the Administration menu displays the active/started indexing processes. The screen looks like this:
Clicking the History menu displays the history of sites indexed with the following information:
Site – site name
Document No. – number of documents in the index
Type – operation type: indexing
Started – operation start time
Finished – operation finish time
Length – length of the operation
Clicking the Clear button clears the history.
Clicking the Site name displays the page showing all not indexed files during the operation (if any).
Table of Contents
Search part of the application consists of a search module that enables:
Basic search
Advanced search
File download
Clicking the SEARCH button on the main page loads the sites basic search and displays it in a new web page:
Checking the checkboxes in the top of the page selects sites to be searched. Basic searsh is searh over content of the document. According to this, query examples are listed in the table.
Table 3.1. Examples of search over text field
Query expression | Matches document that |
search | Contain the term search |
search enhydra | Contain the term search or enhydra, or both |
search OR enhydra | Contain the term search or enhydra, or both |
"search application" OR enhydra | Contain the fraze "search application" or just enhydra, or both |
(search OR application) AND enhydra | Contain the term either search OR application AND enhydra. |
"search application" NOT enhydra | "search application" NOT enhydra |
+search +enhydra | Contain search but not contain enhydra |
search AND enhydra | Contain both search and enhydra |
search* | Contain terms that begin with search Note: You cannot use a * symbol as the first character of a search |
search~ | Contain terms that are close to the word search |
sna*per | Contain terms that begin with "sna" and ends with "per" |
snapp?r | Contain terms that are close to the word snapp?r Note: You cannot use a ? symbol as the first character of a search. |
Clicking the Search button performs the search.
Clicking the Advanced Search button on the basic search page loads the sites advanced search and displays it in a new web page:
Checking the checkboxes in the top of the page selects sites to be searched.
Advanced search enables more complex and detailed searches like: searching over File Type, Words (contents), title, document properties , Meta Data and over other file metadata.
Available fields (document specific metadata) over whom search can be obtained are clasified by field type:
'File Type', ''Words' , 'Title', 'Author', 'Last saved by' are text fields, examples of query expresions over them are listed in the 'Examples of search over text field' table.
'Modified', 'Created', 'Accessed' or 'Mail Sent/Received' are date fields, examples of query expresions over them are listed in the 'Examples of search over Date field' table.
'Document Properties' and 'Meta Data ' are specific text fields, consist of collection pair key/value. Examples of query expresions are listed in the 'Examples of search over 'Document Properties' or 'Meta Data' field' table.
Table 3.2. Examples of search over Date field
Modified, Created, Accessed or Mail Sent/Received Field | Matches documents that |
From: 20020101 To: 20030101 | Are between "Year : 2002 , Mounth : 01 , Date : 01" and "Year : 2003 , Mounth : 01 , Date : 01" |
From: 20020101 To: = | Are sent/received "Year : 2002 , Mounth : 01 , Date : 01" |
From: 20020101 To: | Are between "Year : 2002 , Mounth : 01 , Date : 01" and current date |
From: To: 20020101 | Are between "Year : 1970 , Mounth : 01 , Date : 01" and "Year : 2002 , Mounth : 01 , Date : 01" |
Table 3.3. Examples of search over 'Document Properties' or 'Meta Data' field
Modified, Created, Accessed or Mail Sent/Received Field | Matches documents that |
Key: search Value: enhydra | 'search' is equal with "Property Name" and the 'enhydra' is equal with "Property Value". The query (fraze) will be : '("search = enhydra"' |
Clicking the Mail Search button on the basic search page loads the sites E-Mail search and displays it in a new web page:
Checking the checkboxes in the top of the page selects sites to be searched.
E-Mail search enables more complex and detailed searches through E-mail metadata like: date of sent/received e-mail, from/to/cc/bcc, subject of the e-mail and finally through e-mail content.
Available fields (e-mail specific metadata) over whom search can be obtained are clasified by field type:
'Content ', 'Subject ' , 'From', 'To', 'CC' and 'BCC' are text fields, examples of query expresions over them are listed in the 'Examples of search over text field' table.
Depends which radio button is selected search can be obtained over 'Mail Sent/Received' date fields or will be ignored if selected 'Uknown', examples of query expresions over them are listed in the 'Examples of search over Date field' table.
Search results representation is a standardized web page output just like any other search engine (i.e. Google). The main difference between 'Together Search Server' and other search engines is that it includes XSL transformations that are defined in an .xsl file. This way a system administrator can style the search results output in accordance with system needs/wishes.
File that needs to be edited in order to change the search output webpage in runtime is WEB_INF\classes\xls\searchResults.xls, WEB_INF\classes\xls\search.xls and WEB_INF\classes\xls\advancedSearch. For example, editing the “font” parameter and changing the font size, changes the font size (and the look of the page) as soon as the next search on the search page is performed.
The standard results page:
Clicking the file (link) in the Search Results page opens the selected file. This is done only if the Download parameter in the application configuration file is set to “ON”, and if the file path was correctly mapped while creating a new path.
'Together Search Server' application is made up of one presentation object. Name of this presentation object is Search.po. It is accessed by pointing to the following address: http://server/tss/Search.po.
This po object uses request parameters to form an XML file defined by a search.dtd. After the XML is created the po object uses an xsl file defined in xsl request parameter (default is ‘search.xsl’) to transform the xml file and display the results.
NOTE : If value of xsl request parameter is ‘none’ the result will be XML file (XML file will not be transformed).
Request parameters:
xsl – The xsl file that will be used to transform xml file. If this parameter is not defined the default xsl will be used (search.xsl)
from, to – These parameters defines documents (from-to) that will be displayed in search result page.
If these parameters are not defined the default search result will be used (‘from’=1, ‘to’=10).
if parameter ‘to’ is not defined and parameter ‘from’ is, search result will be (‘from’=from, ‘to’=from+10)
if parameter ‘from’ is not defined and parameter ‘to’ is, search result will be (‘from’=to- 10, ‘to’=to)
These parameters are compared to configuration parameter MaxRange (defined in web.xml file) to restrict range of search result
type – The type of document to search
contents – The term to search in content of document
title - The term to search in title of document
modifiedfrom , modifiedto - The range of document modification time to be searched
propertiesKey , propertiesValue – Search in Word Document properties field for key = value
metaDataKey , metaDataValue – Search in Meta Data field for key = value
contentLength - Content length in characters to be displayed in search result
metaDataLength - MetaData length in characters to be displayed in search result
wordLength - Word Document length in characters to be displayed in search result
sortType - sorting by :relevance(by default) , newest (by newest modified files) and oldest (by oldest modified files)
searchDatePattern - Overrides configuration parameter 'SearchDatePattern'.
resultDatePattern - Overrides configuration parameter 'ResultDatePattern'.
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xsd:element name="Summary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Configuration"/> <xsd:element ref="SearchedParameters"/> <xsd:element ref="Search"/> <xsd:element ref="GoogleSearch" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Configuration"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Site" minOccurs="0" maxOccurs="unbounded"/> <xsd:element ref="DocumentGroup" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Site"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Name"/> <xsd:element name="IndexDir" type="xsd:string"/> <xsd:element name="Download" type="xsd:boolean"/> <xsd:element name="Searched" type="xsd:boolean"/> <xsd:element name="FileNR" type="xsd:int"/> <xsd:element name="QueryNR" type="xsd:int"/> <xsd:element name="LastQuery" type="xsd:string"/> <xsd:element name="LastUpdate" type="xsd:string"/> <xsd:element ref="Path" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="DocumentGroup"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Name"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Name" type="xsd:string"/> <xsd:element name="Path"> <xsd:complexType> <xsd:sequence> <xsd:element name="Type" type="xsd:string"/> <xsd:element name="Root" type="xsd:string"/> <xsd:element name="MappingRoot" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="SearchedParameters"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Parameter"> <xsd:complexType> <xsd:sequence> <xsd:element name="Key" type="xsd:string"/> <xsd:element name="Value" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Search"> <xsd:complexType> <xsd:sequence> <xsd:element ref="SearchSummary"/> <xsd:element ref="SearchResult"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="SearchSummary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="SearchedTerm"/> <xsd:element ref="BeginIndex"/> <xsd:element ref="EndIndex"/> <xsd:element ref="DocsNumber"/> <xsd:element ref="SearchedTime"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="SearchedTerm" type="xsd:string"/> <xsd:element name="BeginIndex" type="xsd:int"/> <xsd:element name="EndIndex" type="xsd:int"/> <xsd:element name="DocsNumber" type="xsd:int" nillable="false"/> <xsd:element name="SearchedTime" type="xsd:string"/> <xsd:element name="SearchResult"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Result" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Result"> <xsd:complexType> <xsd:sequence> <xsd:element ref="SiteName"/> <xsd:element ref="Title"/> <xsd:element name="PreviewURL" type="xsd:string"/> <xsd:element name="FileType" type="xsd:string"/> <xsd:element name="FileName" type="xsd:string"/> <xsd:element name="AbsolutFileName" type="xsd:string"/> <xsd:element name="AbsolutDirPath" type="xsd:string"/> <xsd:element name="SearchedTerm" type="xsd:string"/> <xsd:element name="AbsolutFilePath" type="xsd:string"/> <xsd:element name="RelativeDirPath" type="xsd:string"/> <xsd:element name="RelativeFilePath" type="xsd:string"/> <xsd:element name="InsideContainerFilePath" type="xsd:string"/> <xsd:element name="Mapped" type="xsd:string"/> <xsd:element name="GrantedDownload" type="xsd:string"/> <xsd:element name="Score" type="xsd:string"/> <xsd:element name="LuceneID" type="xsd:int"/> <xsd:element name="Modified" type="xsd:string"/> <xsd:element name="Created" type="xsd:string"/> <xsd:element name="Accessed" type="xsd:string"/> <xsd:element name="Owner" type="xsd:string"/> <xsd:element name="Size" type="xsd:string"/> <xsd:element ref="Content"/> <xsd:element name="Properties" type="xsd:string"/> <xsd:element name="MetaData" type="xsd:string"/> <xsd:element name="Author" type="xsd:string"/> <xsd:element name="LastSavedBy" type="xsd:string"/> <xsd:element name="Subject" type="xsd:string"/> <xsd:element name="From" type="xsd:string"/> <xsd:element name="To" type="xsd:string"/> <xsd:element name="CC" type="xsd:string"/> <xsd:element name="BCC" type="xsd:string"/> <xsd:element name="MailSentDate" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="MailReceivedDate" type="xsd:string" minOccurs="0" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="GoogleSearch"> <xsd:complexType> <xsd:sequence> <xsd:element ref="GoogleSearchSummary"/> <xsd:element ref="GoogleSearchResult"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="GoogleSearchSummary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="SearchedTerm"/> <xsd:element ref="BeginIndex"/> <xsd:element ref="EndIndex"/> <xsd:element ref="DocsNumber"/> <xsd:element ref="SearchedTime"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="GoogleSearchResult"> <xsd:complexType> <xsd:sequence> <xsd:element ref="GoogleResult" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="GoogleResult"> <xsd:complexType> <xsd:sequence> <xsd:element ref="SiteName"/> <xsd:element ref="Title"/> <xsd:element name="URL" type="xsd:string"/> <xsd:element ref="Content"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="SiteName" type="xsd:string"/> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Content" type="xsd:string"/> </xsd:schema>
Table of Contents
'Together Document Viewer' is application for previewing files. It could be used with 'Together Search Server' or as stand alone application with parameter parseOnFly when file will be first parsed and result will be shown. When it is used with s'Together Search Server' it shows indexer content of the file. It has two presentation object, Preview.po and ShowPicture.po.
This po object uses request parameters to form an XML file defined by a preview.dtd. After the XML is created the po object uses an xsl file defined in xsl request parameter (default is ‘preiew.xsl’) to transform the xml file and display the results.
xsl – The xsl file that will be used to transform xml file. If this parameter is not defined the default xsl will be used (preview.xsl). If xsl=none is used, output will be xml tree.
query - The query was used for search.
id – Lucene id of the document placed in the index. It must be used with parameter SiteName
SiteName - The name of the site.
fullFilePath – Valid URL of the file for preview. If parseOnFly is set to true, file will be parsed and result will be displayed. This way siteName and MetaData will not be available. Without parseOnFly parameter 'Together Search Server' engine will be searched for file with given file path and result from indexer will be shown (no parsing will be performed)
parseOnFly – Overrides searching 'Together Search Server' engine and forces preview on fly
parserPageLimit – Overrides configuration parameter 'Previewer.ParserPageLimit'.
parserCharacterLimit – Overrides configuration parameter 'Previewer.ParserCharacterLimit'.
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="Summary"> <xsd:complexType> <xsd:sequence> <xsd:element ref="SearchedParameters"/> <xsd:element ref="Preview"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="SearchedParameters"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Parameter"> <xsd:complexType> <xsd:sequence> <xsd:element name="Key" type="xsd:string"/> <xsd:element name="Value" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Preview"> <xsd:complexType> <xsd:sequence> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="AbsolutFileName" type="xsd:string"/> <xsd:element ref="AbsolutFilePath"/> <xsd:element name="FileType" type="xsd:string"/> <xsd:element name="SiteName" type="xsd:string"/> <xsd:element name="From" type="xsd:string"/> <xsd:element name="To" type="xsd:string"/> <xsd:element name="CC" type="xsd:string"/> <xsd:element name="BCC" type="xsd:string"/> <xsd:element name="Subject" type="xsd:string"/> <xsd:element name="Sent" type="xsd:string"/> <xsd:element name="Received" type="xsd:string"/> <xsd:element name="Signed" type="xsd:string"/> <xsd:element name="Priority" type="xsd:string"/> <xsd:element name="DeliveryReceiptRequested" type="xsd:string"/> <xsd:element name="ReadReceiptRequested" type="xsd:string"/> <xsd:element name="Expires" type="xsd:string"/> <xsd:element name="Sensitivity" type="xsd:string"/> <xsd:element name="Content" type="xsd:string"/> <xsd:element name="Properties" type="xsd:string"/> <xsd:element name="MetaData" type="xsd:string"/> <xsd:element ref="ContainerFileList" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="AbsolutFilePath"> <xsd:complexType> <xsd:sequence> <xsd:element name="FilePath" type="xsd:string"/> <xsd:element ref="InsideContainerFilePath" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="ContainerFileList"> <xsd:complexType> <xsd:sequence> <xsd:element ref="ContainerFile" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="ContainerFile"> <xsd:complexType> <xsd:choice> <xsd:sequence> <xsd:element ref="InsideContainerFilePath"/> <xsd:element name="LuceneID" type="xsd:string" minOccurs="0"/> </xsd:sequence> <xsd:element ref="Preview"/> </xsd:choice> </xsd:complexType> </xsd:element> <xsd:element name="InsideContainerFilePath"> <xsd:complexType> <xsd:sequence> <xsd:element name="FilePath" type="xsd:string"/> <xsd:element name="FileType" type="xsd:string"/> <xsd:element ref="InsideContainerFilePath" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>