<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>lifti Wiki Rss Feed</title><link>http://lifti.codeplex.com/wikipage</link><description>lifti Wiki Rss Description</description><item><title>Updated Wiki: Home</title><link>https://lifti.codeplex.com/wikipage?version=17</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;img title="image" src="http://download.codeplex.com/download?ProjectName=lifti&amp;DownloadId=248715" border="0" alt="image" width="399" height="210" align="right" style="padding-left:0px; padding-right:0px; display:inline; float:right; padding-top:0px; border-width:0px"&gt;LIFTI
 provides a simple API that allows you to build a searchable full text index. This can be useful for document retrieval or simply allowing .NET objects to be searched for by associated text.&lt;/p&gt;
&lt;p&gt;Version 0.5 of the library introduces the PersistedFullTextIndex which automatically persists the index to a backing file store as it is being used. This opens up the possibility of using it in an application to index text associated to data stored in a
 database that doesn&amp;rsquo;t provide its own full text indexing services, such as SQL Server Compact.&lt;/p&gt;
&lt;p&gt;There are 3 samples (4 if you count the timing comparison application) included in the solution &amp;ndash; these should give you a pretty good idea how to get started. They&amp;rsquo;re also included as binaries in the download.
&lt;br&gt;
&lt;br&gt;
This project started as a &lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx" target="_blank"&gt;
single blog entry&lt;/a&gt; and has grown into something that may actually be genuinely useful. The basic principle behind LIFTI is that it allows you to index items (or their keys) against text associated to them - once the text has been indexed it is stored in
 a compact and searchable form, meaning that the overall text for each item need not be persisted.
&lt;br&gt;
&lt;br&gt;
The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is now up to date with the 0.5 release &amp;ndash; I&amp;rsquo;ll probably look to extend the documentation further in the near future..&lt;/p&gt;
&lt;p&gt;LIFTI is currently compiled against version 3.5 of the .NET Framework &amp;ndash; I&amp;rsquo;m probably going to be moving it to version 4.0 in the next release &amp;ndash; if you want to influence this in one way or the other make your
&lt;a href="http://lifti.codeplex.com/discussions/257442" target="_blank"&gt;thoughts known&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Installing LIFTI&lt;/h2&gt;
&lt;h3&gt;Manual Installation&lt;/h3&gt;
&lt;p&gt;LIFTI is available from the &lt;a href="http://lifti.codeplex.com/releases"&gt;downloads&lt;/a&gt; page &amp;ndash; download and extract the binaries yourself and reference them in your project.&lt;/p&gt;
&lt;h3&gt;Nuget&lt;/h3&gt;
&lt;p&gt;LIFTI is also available as a &lt;a href="http://nuget.org/List/Packages/LIFTI" target="_blank"&gt;
nuget package&lt;/a&gt;. &lt;a href="http://nuget.org/" target="_blank"&gt;Nuget&lt;/a&gt; is a great way to add and manage your project dependencies.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;My blog (&lt;a href="http://www.goatly.net"&gt;http://www.goatly.net&lt;/a&gt;) is where a lot of articles about LIFTI have, and will continue, to appear.&lt;/p&gt;
&lt;h3&gt;Tutorials&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/7/1/tutorial-using-lifti-in-an-mvc-3-web-application.aspx" target="_blank"&gt;Using LIFTI in an MVC 3 application&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Recent articles&lt;/h3&gt;
&lt;p&gt;&lt;a title="PersistedFullTextIndexes with non-primitive types" href="http://www.goatly.net/persistedfulltextindexes-with-non-primitive-types"&gt;PersistedFullTextIndexes with non-primitive types&lt;/a&gt;&lt;br&gt;
&lt;a title="Describing the LIFTI persistence file format" href="http://www.goatly.net/2011/4/8/Describing-the-LIFTI-persistence-file-format.aspx"&gt;Describing the LIFTI persistence file format&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/6/10/lifti-xmlwordsplitter.aspx" target="_blank"&gt;Introduction to the XmlWordSplitter class&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/6/8/changes-to-the-lifti-api.aspx" target="_blank"&gt;Discussion of the breaking changes between versions 0.4 and 0.5&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Older links&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx"&gt;This original article describing the initial intentions of this project&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/12/7/lifti-and-porter-stemming.aspx"&gt;This article explains the new word stemming features available in LIFTI&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/11/18/lifti-searching-pascal-cased-words.aspx"&gt;An example of using a custom word splitter to index Pascal-cased words&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/1/5/lifti-changes-ahoy.aspx"&gt;An article discussing the querying, updatable index and serialization changes&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Mon, 27 May 2013 09:14:06 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130527091406A</guid></item><item><title>Updated Wiki: Constructing a full text indexes</title><link>https://lifti.codeplex.com/wikipage?title=Constructing a full text indexes&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Constructing an in-memory full text index&lt;/h1&gt;
&lt;p&gt;The code to create a new full text index class looks like this:&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;MyType&amp;gt;(); 
var updatableIndex = new UpdatableFullTextIndex&amp;lt;MyType&amp;gt;();&lt;/pre&gt;
&lt;p&gt;From this you can see that all forms of the full text index class are generic types defining the type of item that the index will contain.&lt;/p&gt;
&lt;p&gt;There are two approaches that you can take to indexing items: indexing keys and indexing .NET objects.&lt;/p&gt;
&lt;h2&gt;Indexing keys&lt;/h2&gt;
&lt;p&gt;The first approach is to index a unique key for your items. This means that the index itself will only store a
&lt;em&gt;reference&lt;/em&gt; or id to the indexed item. This might be an integer, a string, a Guid or other primitive type.
&lt;br&gt;
The constructor for this approach looks like this (Note that the FullTextIndex generic type is
&lt;em&gt;int&lt;/em&gt;):&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;int&amp;gt;()&lt;/pre&gt;
&lt;p&gt;The main benefit to this approach is that once an item has been indexed the associated text doesn&amp;rsquo;t need to be retained in memory.&lt;/p&gt;
&lt;h2&gt;Indexing .NET objects&lt;/h2&gt;
&lt;p&gt;If your items are always loaded into memory and they contain all the text that you want to index, you can index them directly:&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;Customer&amp;gt;();&lt;/pre&gt;
&lt;p&gt;Here the generic type of FullTextIndex is &lt;em&gt;Customer&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Obviously the drawback to this approach is that all the instances are retained in memory, along with all their associated properties, including the text.&lt;/p&gt;
&lt;h1&gt;Constructing a persisted full text index&lt;/h1&gt;
&lt;p&gt;Full text indexes can be created by passing the path to the persisted file into the constructor:&lt;/p&gt;
&lt;pre&gt;var indexFilePath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
    Path.Combine(&amp;quot;MyApplication&amp;quot;, &amp;quot;MyTextIndex.dat&amp;quot;);

var index = new PersistedFullTextIndex&amp;lt;int&amp;gt;(indexFilePath);&lt;/pre&gt;
&lt;p&gt;As with the FullTextIndex and UpdatableFullTextIndex, the persisted full index is a generic type. It is strongly recommended that you use a key-based approach to the index, by restricting the type that you store in the index to a primitive type, e.g. int,
 string, etc.&lt;/p&gt;
&lt;p&gt;If you do need to store some other type in the index, such as a Guid or custom class, then this
&lt;a title="PersistedFullTextIndexes with non-primitive types" href="http://www.goatly.net/persistedfulltextindexes-with-non-primitive-types"&gt;
blog post &lt;/a&gt;should get you started.&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Mon, 27 May 2013 09:11:29 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Constructing a full text indexes 20130527091129A</guid></item><item><title>Updated Wiki: Home</title><link>https://lifti.codeplex.com/wikipage?version=16</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;img title="image" src="http://download.codeplex.com/download?ProjectName=lifti&amp;DownloadId=248715" border="0" alt="image" width="399" height="210" align="right" style="padding-left:0px; padding-right:0px; display:inline; float:right; padding-top:0px; border-width:0px"&gt;LIFTI
 provides a simple API that allows you to build a searchable full text index. This can be useful for document retrieval or simply allowing .NET objects to be searched for by associated text.&lt;/p&gt;
&lt;p&gt;Version 0.5 of the library introduces the PersistedFullTextIndex which automatically persists the index to a backing file store as it is being used. This opens up the possibility of using it in an application to index text associated to data stored in a
 database that doesn&amp;rsquo;t provide its own full text indexing services, such as SQL Server Compact.&lt;/p&gt;
&lt;p&gt;There are 3 samples (4 if you count the timing comparison application) included in the solution &amp;ndash; these should give you a pretty good idea how to get started. They&amp;rsquo;re also included as binaries in the download.
&lt;br&gt;
&lt;br&gt;
This project started as a &lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx" target="_blank"&gt;
single blog entry&lt;/a&gt; and has grown into something that may actually be genuinely useful. The basic principle behind LIFTI is that it allows you to index items (or their keys) against text associated to them - once the text has been indexed it is stored in
 a compact and searchable form, meaning that the overall text for each item need not be persisted.
&lt;br&gt;
&lt;br&gt;
The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is now up to date with the 0.5 release &amp;ndash; I&amp;rsquo;ll probably look to extend the documentation further in the near future..&lt;/p&gt;
&lt;p&gt;LIFTI is currently compiled against version 3.5 of the .NET Framework &amp;ndash; I&amp;rsquo;m probably going to be moving it to version 4.0 in the next release &amp;ndash; if you want to influence this in one way or the other make your
&lt;a href="http://lifti.codeplex.com/discussions/257442" target="_blank"&gt;thoughts known&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Installing LIFTI&lt;/h2&gt;
&lt;h3&gt;Manual Installation&lt;/h3&gt;
&lt;p&gt;LIFTI is available from the &lt;a href="http://lifti.codeplex.com/releases"&gt;downloads&lt;/a&gt; page &amp;ndash; download and extract the binaries yourself and reference them in your project.&lt;/p&gt;
&lt;h3&gt;Nuget&lt;/h3&gt;
&lt;p&gt;LIFTI is also available as a &lt;a href="http://nuget.org/List/Packages/LIFTI" target="_blank"&gt;
nuget package&lt;/a&gt;. &lt;a href="http://nuget.org/" target="_blank"&gt;Nuget&lt;/a&gt; is a great way to add and manage your project dependencies.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;My blog (&lt;a href="http://www.goatly.net"&gt;http://www.goatly.net&lt;/a&gt;) is where a lot of articles about LIFTI have, and will continue, to appear.&lt;/p&gt;
&lt;h3&gt;Tutorials&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/7/1/tutorial-using-lifti-in-an-mvc-3-web-application.aspx" target="_blank"&gt;Using LIFTI in an MVC 3 application&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Recent articles&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/6/10/lifti-xmlwordsplitter.aspx" target="_blank"&gt;Introduction to the XmlWordSplitter class&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/6/8/changes-to-the-lifti-api.aspx" target="_blank"&gt;Discussion of the breaking changes between versions 0.4 and 0.5&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Older links&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx"&gt;This original article describing the initial intentions of this project&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/12/7/lifti-and-porter-stemming.aspx"&gt;This article explains the new word stemming features available in LIFTI&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/11/18/lifti-searching-pascal-cased-words.aspx"&gt;An example of using a custom word splitter to index Pascal-cased words&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/1/5/lifti-changes-ahoy.aspx"&gt;An article discussing the querying, updatable index and serialization changes&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Mon, 20 May 2013 10:20:23 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130520102023A</guid></item><item><title>Updated Wiki: Documentation</title><link>http://lifti.codeplex.com/documentation?version=10</link><description>&lt;div class="wikidoc"&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;The &lt;a href="/wikipage?title=Quick%20Start&amp;referringTitle=Documentation"&gt;Quick Start&lt;/a&gt; is a really good place to start &amp;ndash; it will show you briefly how to use the index classes and describes them at a high level.&lt;/p&gt;
&lt;p&gt;The downloadable source for each release contains several samples for you to investigate. You can also download the API documentation generated from the source code.&lt;/p&gt;
&lt;h2&gt;Basic operations&lt;/h2&gt;
&lt;p&gt;&lt;a href="/wikipage?title=Constructing%20a%20full%20text%20indexes&amp;referringTitle=Documentation"&gt;Constructing full text indexes&lt;/a&gt;
&lt;br&gt;
Find out how to construct the various full text index classes, FullTextIndex, UpdatableFullTextIndex and PersistedFullTextIndex.&lt;/p&gt;
&lt;p&gt;&lt;a href="/wikipage?title=Word%20splitters&amp;referringTitle=Documentation"&gt;Word splitters&lt;/a&gt;
&lt;br&gt;
Understand the various ways that word splitters can be used to process text being indexed and searched.&lt;/p&gt;
&lt;p&gt;&lt;a href="/wikipage?title=Searching%20the%20full%20text%20index&amp;referringTitle=Documentation"&gt;Searching the full text index&lt;/a&gt;
&lt;br&gt;
Learn the LIFTI query syntax used to parse queries with the LiftiQueryParser.&lt;/p&gt;
&lt;h2&gt;Advanced documentation&lt;/h2&gt;
&lt;p&gt;&lt;a href="/wikipage?title=Locking%20behaviour&amp;referringTitle=Documentation"&gt;Locking behaviour&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="Persistence File Format" href="/wikipage?title=Persistence%20file%20format"&gt;Persistence File Format&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 20 Sep 2012 21:22:13 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Documentation 20120920092213P</guid></item><item><title>Updated Wiki: Persistence file format</title><link>https://lifti.codeplex.com/wikipage?title=Persistence file format&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://download-codeplex.sec.s-msft.com/Download?ProjectName=lifti&amp;DownloadId=488031" width="537" height="519" style="border-left-width:0px; border-right-width:0px; border-bottom-width:0px; padding-top:0px; padding-left:0px; display:inline; padding-right:0px; border-top-width:0px"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://download-codeplex.sec.s-msft.com/Download?ProjectName=lifti&amp;DownloadId=488032" width="792" height="633" style="border-left-width:0px; border-right-width:0px; border-bottom-width:0px; padding-top:0px; padding-left:0px; margin:0px; display:inline; padding-right:0px; border-top-width:0px"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://download-codeplex.sec.s-msft.com/Download?ProjectName=lifti&amp;DownloadId=488033" width="798" height="630" style="border-left-width:0px; border-right-width:0px; border-bottom-width:0px; padding-top:0px; padding-left:0px; margin:0px; display:inline; padding-right:0px; border-top-width:0px"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://download-codeplex.sec.s-msft.com/Download?ProjectName=lifti&amp;DownloadId=488034" width="801" height="630" style="border-left-width:0px; border-right-width:0px; border-bottom-width:0px; padding-top:0px; padding-left:0px; margin:0px; display:inline; padding-right:0px; border-top-width:0px"&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>mikegoatly</author><pubDate>Thu, 20 Sep 2012 21:20:37 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Persistence file format 20120920092037P</guid></item><item><title>Updated Wiki: Home</title><link>http://lifti.codeplex.com/wikipage?version=15</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;img title="image" border="0" alt="image" align="right" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=lifti&amp;DownloadId=248715" width="399" height="210" style="border-right-width:0px; padding-left:0px; padding-right:0px; display:inline; float:right; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px"&gt;LIFTI
 provides a simple API that allows you to build a searchable full text index. This can be useful for document retrieval or simply allowing .NET objects to be searched for by associated text.
&lt;/p&gt;
&lt;p&gt;Version 0.5 of the library introduces the PersistedFullTextIndex which automatically persists the index to a backing file store as it is being used. This opens up the possibility of using it in an application to index text associated to data stored in a
 database that doesn’t provide its own full text indexing services, such as SQL Server Compact.&lt;/p&gt;
&lt;p&gt;There are 3 samples (4 if you count the timing comparison application) included in the solution – these should give you a pretty good idea how to get started. They’re also included as binaries in the download.
&lt;br&gt;
&lt;br&gt;
This project started as a &lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx" target="_blank"&gt;
single blog entry&lt;/a&gt; and has grown into something that may actually be genuinely useful. The basic principle behind LIFTI is that it allows you to index items (or their keys) against text associated to them - once the text has been indexed it is stored in
 a compact and searchable form, meaning that the overall text for each item need not be persisted.
&lt;br&gt;
&lt;br&gt;
The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is now up to data with the 0.5 release – I’ll probably look to extend the documentation further in the near future..&lt;/p&gt;
&lt;p&gt;LIFTI is currently compiled against version 3.5 of the .NET Framework – I’m probably going to be moving it to version 4.0 in the next release – if you want to influence this in one way or the other make your
&lt;a href="http://lifti.codeplex.com/discussions/257442" target="_blank"&gt;thoughts known&lt;/a&gt;!
&lt;/p&gt;
&lt;h2&gt;Installing LIFTI&lt;/h2&gt;
&lt;h3&gt;Manual Installation&lt;/h3&gt;
&lt;p&gt;LIFTI is available from the &lt;a href="http://lifti.codeplex.com/releases"&gt;downloads&lt;/a&gt; page – download and extract the binaries yourself and reference them in your project.&lt;/p&gt;
&lt;h3&gt;Nuget&lt;/h3&gt;
&lt;p&gt;LIFTI is also available as a &lt;a href="http://nuget.org/List/Packages/LIFTI" target="_blank"&gt;
nuget package&lt;/a&gt;. &lt;a href="http://nuget.org/" target="_blank"&gt;Nuget&lt;/a&gt; is a great way to add and manage your project dependencies.
&lt;br&gt;
&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;My blog (&lt;a href="http://www.goatly.net"&gt;http://www.goatly.net&lt;span&gt;&lt;/span&gt;&lt;/a&gt;) is where a lot of articles about LIFTI have, and will continue, to appear.
&lt;/p&gt;
&lt;h3&gt;Tutorials&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/7/1/tutorial-using-lifti-in-an-mvc-3-web-application.aspx" target="_blank"&gt;Using LIFTI in an MVC 3 application&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Recent articles&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/6/10/lifti-xmlwordsplitter.aspx" target="_blank"&gt;Introduction to the XmlWordSplitter class&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/6/8/changes-to-the-lifti-api.aspx" target="_blank"&gt;Discussion of the breaking changes between versions 0.4 and 0.5&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Older links&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx"&gt;This original article describing the initial intentions of this project&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/12/7/lifti-and-porter-stemming.aspx"&gt;This article explains the new word stemming features available in LIFTI&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/11/18/lifti-searching-pascal-cased-words.aspx"&gt;An example of using a custom word splitter to index Pascal-cased words&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/1/5/lifti-changes-ahoy.aspx"&gt;An article discussing the querying, updatable index and serialization changes&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Wed, 06 Jul 2011 13:06:57 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110706010657P</guid></item><item><title>Updated Wiki: Home</title><link>http://lifti.codeplex.com/wikipage?version=14</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;b&gt;Project Description&lt;/b&gt; &lt;br&gt;
&lt;img title="image" border="0" alt="image" align="right" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=lifti&amp;DownloadId=248715" width="399" height="210" style="border-right-width:0px; padding-left:0px; padding-right:0px; display:inline; float:right; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px"&gt;LIFTI
 provides a simple API that allows you to build a searchable full text index. This can be useful for document retrieval or simply allowing .NET objects to be searched for by associated text.
&lt;/p&gt;
&lt;p&gt;Version 0.5 of the library introduces the PersistedFullTextIndex which automatically persists the index to a backing file store as it is being used. This opens up the possibility of using it in an application to index text associated to data stored in a
 database that doesn’t provide its own full text indexing services, such as SQL Server Compact.&lt;/p&gt;
&lt;p&gt;There are 3 samples (4 if you count the timing comparison application) included in the solution – these should give you a pretty good idea how to get started. They’re also included as binaries in the download.
&lt;br&gt;
&lt;br&gt;
This project started as a &lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx" target="_blank"&gt;
single blog entry&lt;/a&gt; and has grown into something that may actually be genuinely useful. The basic principle behind LIFTI is that it allows you to index items (or their keys) against text associated to them - once the text has been indexed it is stored in
 a compact and searchable form, meaning that the overall text for each item need not be persisted.
&lt;br&gt;
&lt;br&gt;
The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is now up to data with the 0.5 release – I’ll probably look to extend the documentation further in the near future..&lt;/p&gt;
&lt;p&gt;LIFTI is currently compiled against version 3.5 of the .NET Framework – I’m probably going to be moving it to version 4.0 in the next release – if you want to influence this in one way or the other make your
&lt;a href="http://lifti.codeplex.com/discussions/257442" target="_blank"&gt;thoughts known&lt;/a&gt;!
&lt;/p&gt;
&lt;h2&gt;Nuget&lt;/h2&gt;
&lt;p&gt;LIFTI is available as a &lt;a href="http://nuget.org/List/Packages/LIFTI" target="_blank"&gt;
nuget package&lt;/a&gt;. Nuget is a great way to add and manage your project dependencies.
&lt;br&gt;
&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;My blog (&lt;a href="http://www.goatly.net"&gt;http://www.goatly.net&lt;span&gt;&lt;/span&gt;&lt;/a&gt;) is where a lot of articles about LIFTI have, and will continue, to appear.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/6/10/lifti-xmlwordsplitter.aspx" target="_blank"&gt;Introduction to the XmlWordSplitter class&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/6/8/changes-to-the-lifti-api.aspx" target="_blank"&gt;Discussion of the breaking changes between versions 0.4 and 0.5&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Older links&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx"&gt;This original article describing the initial intentions of this project&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/12/7/lifti-and-porter-stemming.aspx"&gt;This article explains the new word stemming features available in LIFTI&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/11/18/lifti-searching-pascal-cased-words.aspx"&gt;An example of using a custom word splitter to index Pascal-cased words&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/1/5/lifti-changes-ahoy.aspx"&gt;An article discussing the querying, updatable index and serialization changes&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Mon, 27 Jun 2011 18:44:36 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110627064436P</guid></item><item><title>Updated Wiki: Documentation</title><link>http://lifti.codeplex.com/documentation?version=9</link><description>&lt;div class="wikidoc"&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;The &lt;a href="/wikipage?title=Quick%20Start&amp;referringTitle=Documentation"&gt;Quick Start&lt;/a&gt; is a really good place to start – it will show you briefly how to use the index classes and describes them at a high level.
&lt;/p&gt;
&lt;p&gt;The downloadable source for each release contains several samples for you to investigate. You can also download the API documentation generated from the source code.&lt;/p&gt;
&lt;h2&gt;Basic operations&lt;/h2&gt;
&lt;p&gt;&lt;a href="/wikipage?title=Constructing%20a%20full%20text%20indexes&amp;referringTitle=Documentation"&gt;Constructing full text indexes&lt;/a&gt;
&lt;br&gt;
Find out how to construct the various full text index classes, FullTextIndex, UpdatableFullTextIndex and PersistedFullTextIndex.&lt;/p&gt;
&lt;p&gt;&lt;a href="/wikipage?title=Word%20splitters&amp;referringTitle=Documentation"&gt;Word splitters&lt;/a&gt;
&lt;br&gt;
Understand the various ways that word splitters can be used to process text being indexed and searched.&lt;/p&gt;
&lt;p&gt;&lt;a href="/wikipage?title=Searching%20the%20full%20text%20index&amp;referringTitle=Documentation"&gt;Searching the full text index&lt;/a&gt;
&lt;br&gt;
Learn the LIFTI query syntax used to parse queries with the LiftiQueryParser.&lt;/p&gt;
&lt;h2&gt;Advanced documentation&lt;/h2&gt;
&lt;p&gt;&lt;a href="/wikipage?title=Locking%20behaviour&amp;referringTitle=Documentation"&gt;Locking behaviour&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Mon, 13 Jun 2011 16:58:42 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Documentation 20110613045842P</guid></item><item><title>Updated Wiki: Home</title><link>http://lifti.codeplex.com/wikipage?version=13</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;b&gt;Project Description&lt;/b&gt; &lt;br&gt;
&lt;img title="image" border="0" alt="image" align="right" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=lifti&amp;DownloadId=248715" width="399" height="210" style="border-bottom:0px; border-left:0px; padding-left:0px; padding-right:0px; display:inline; float:right; border-top:0px; border-right:0px; padding-top:0px"&gt;LIFTI
 provides a simple API that allows you to build a searchable full text index. This can be useful for document retrieval or simply allowing .NET objects to be searched for by associated text.
&lt;/p&gt;
&lt;p&gt;Version 0.5 of the library introduces the PersistedFullTextIndex which automatically persists the index to a backing file store as it is being used. This opens up the possibility of using it in an application to index text associated to data stored in a
 database that doesn’t provide its own full text indexing services, such as SQL Server Compact.&lt;/p&gt;
&lt;p&gt;There are 3 samples (4 if you count the timing comparison application) included in the solution – these should give you a pretty good idea how to get started. They’re also included as binaries in the download.
&lt;br&gt;
&lt;br&gt;
This project started as a &lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx" target="_blank"&gt;
single blog entry&lt;/a&gt; and has grown into something that may actually be genuinely useful. The basic principle behind LIFTI is that it allows you to index items (or their keys) against text associated to them - once the text has been indexed it is stored in
 a compact and searchable form, meaning that the overall text for each item need not be persisted.
&lt;br&gt;
&lt;br&gt;
The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is now up to data with the 0.5 release – I’ll probably look to extend the documentation further in the near future..&lt;/p&gt;
&lt;p&gt;LIFTI is currently compiled against version 3.5 of the .NET Framework – I’m probably going to be moving it to version 4.0 in the next release – if you want to influence this in one way or the other make your
&lt;a href="http://lifti.codeplex.com/discussions/257442" target="_blank"&gt;thoughts known&lt;/a&gt;!
&lt;br&gt;
&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;My blog (&lt;a href="http://www.goatly.net"&gt;http://www.goatly.net&lt;span&gt;&lt;/span&gt;&lt;/a&gt;) is where a lot of articles about LIFTI have, and will continue, to appear.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/6/8/changes-to-the-lifti-api.aspx" target="_blank"&gt;Discussion of the breaking changes between versions 0.4 and 0.5&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Older links&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx"&gt;This original article describing the initial intentions of this project&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/12/7/lifti-and-porter-stemming.aspx"&gt;This article explains the new word stemming features available in LIFTI&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/11/18/lifti-searching-pascal-cased-words.aspx"&gt;An example of using a custom word splitter to index Pascal-cased words&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/1/5/lifti-changes-ahoy.aspx"&gt;An article discussing the querying, updatable index and serialization changes&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Fri, 10 Jun 2011 15:04:13 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110610030413P</guid></item><item><title>Updated Wiki: Home</title><link>http://lifti.codeplex.com/wikipage?version=12</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;b&gt;Project Description&lt;/b&gt; &lt;br&gt;
LIFTI provides a simple API that allows you to build a searchable full text index. This can be useful for document retrieval or simply allowing .NET objects to be searched for by associated text.
&lt;/p&gt;
&lt;p&gt;Version 0.5 of the library introduces the PersistedFullTextIndex which automatically persists the index to a backing file store as it is being used. This opens up the possibility of using it in an application to index text associated to data stored in a
 database that doesn’t provide its own full text indexing services, such as SQL Server Compact.&lt;/p&gt;
&lt;p&gt;There are 3 samples (4 if you count the timing comparison application) included in the solution – these should give you a pretty good idea how to get started. They’re also included as binaries in the download.
&lt;br&gt;
&lt;br&gt;
This project started as a &lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx" target="_blank"&gt;
single blog entry&lt;/a&gt; and has grown into something that may actually be genuinely useful. The basic principle behind LIFTI is that it allows you to index items (or their keys) against text associated to them - once the text has been indexed it is stored in
 a compact and searchable form, meaning that the overall text for each item need not be persisted.
&lt;br&gt;
&lt;br&gt;
The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is now up to data with the 0.5 release – I’ll probably look to extend the documentation further in the near future..&lt;/p&gt;
&lt;p&gt;LIFTI is currently compiled against version 3.5 of the .NET Framework – I’m probably going to be moving it to version 4.0 in the next release – if you want to influence this in one way or the other make your
&lt;a href="http://lifti.codeplex.com/discussions/257442" target="_blank"&gt;thoughts known&lt;/a&gt;!
&lt;br&gt;
&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;My blog (&lt;a href="http://www.goatly.net"&gt;http://www.goatly.net&lt;span&gt;&lt;/span&gt;&lt;/a&gt;) is where a lot of articles about LIFTI have, and will continue, to appear.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/6/8/changes-to-the-lifti-api.aspx" target="_blank"&gt;Discussion of the breaking changes between versions 0.4 and 0.5&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Older links&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx"&gt;This original article describing the initial intentions of this project&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/12/7/lifti-and-porter-stemming.aspx"&gt;This article explains the new word stemming features available in LIFTI&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/11/18/lifti-searching-pascal-cased-words.aspx"&gt;An example of using a custom word splitter to index Pascal-cased words&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/1/5/lifti-changes-ahoy.aspx"&gt;An article discussing the querying, updatable index and serialization changes&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 09 Jun 2011 21:28:24 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110609092824P</guid></item><item><title>Updated Wiki: Documentation</title><link>http://lifti.codeplex.com/documentation?version=8</link><description>&lt;div class="wikidoc"&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;The &lt;a href="/lifti/wikipage?title=Quick%20Start&amp;referringTitle=Documentation"&gt;
Quick Start&lt;/a&gt; is a really good place to start – it will show you briefly how to use the index classes and describes them at a high level.
&lt;/p&gt;
&lt;p&gt;The downloadable source for each release contains several samples for you to investigate. You can also download the API documentation generated from the source code.&lt;/p&gt;
&lt;h2&gt;Basic operations&lt;/h2&gt;
&lt;p&gt;&lt;a href="/lifti/wikipage?title=Constructing%20a%20full%20text%20indexes&amp;referringTitle=Documentation"&gt;Constructing full text indexes&lt;/a&gt;
&lt;br&gt;
Find out how to construct the various full text index classes, FullTextIndex, UpdatableFullTextIndex and PersistedFullTextIndex.&lt;/p&gt;
&lt;p&gt;&lt;a href="/lifti/wikipage?title=Word%20splitters&amp;referringTitle=Documentation"&gt;Word splitters&lt;/a&gt;
&lt;br&gt;
Understand the various ways that word splitters can be used to process text being indexed and searched.&lt;/p&gt;
&lt;p&gt;&lt;a href="/lifti/wikipage?title=Searching%20the%20full%20text%20index&amp;referringTitle=Documentation"&gt;Searching the full text index&lt;/a&gt;
&lt;br&gt;
Learn the LIFTI query syntax used to parse queries with the LiftiQueryParser.&lt;/p&gt;
&lt;h2&gt;Advanced documentation&lt;/h2&gt;
&lt;p&gt;&lt;a href="/lifti/wikipage?title=Locking%20behaviour&amp;referringTitle=Documentation"&gt;Locking behaviour&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 09 Jun 2011 21:26:36 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Documentation 20110609092636P</guid></item><item><title>Updated Wiki: Constructing a full text indexes</title><link>http://lifti.codeplex.com/wikipage?title=Constructing a full text indexes&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Constructing an in-memory full text index&lt;/h1&gt;
&lt;p&gt;The code to create a new full text index class looks like this:&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;MyType&amp;gt;(); 
var updatableIndex = new UpdatableFullTextIndex&amp;lt;MyType&amp;gt;();&lt;/pre&gt;
&lt;p&gt;From this you can see that all forms of the full text index class are generic types defining the type of item that the index will contain.&lt;/p&gt;
&lt;p&gt;There are two approaches that you can take to indexing items: indexing keys and indexing .NET objects.
&lt;/p&gt;
&lt;h2&gt;Indexing keys&lt;/h2&gt;
&lt;p&gt;The first approach is to index a unique key for your items. This means that the index itself will only store a
&lt;i&gt;reference&lt;/i&gt; or id to the indexed item. This might be an integer, a string, a Guid or other primitive type.
&lt;br&gt;
The constructor for this approach looks like this (Note that the FullTextIndex generic type is
&lt;i&gt;int&lt;/i&gt;): &lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;int&amp;gt;()&lt;/pre&gt;
&lt;p&gt;The main benefit to this approach is that once an item has been indexed the associated text doesn’t need to be retained in memory.&lt;/p&gt;
&lt;h2&gt;Indexing .NET objects&lt;/h2&gt;
&lt;p&gt;If your items are always loaded into memory and they contain all the text that you want to index, you can index them directly:&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;Customer&amp;gt;();&lt;/pre&gt;
&lt;p&gt;Here the generic type of FullTextIndex is &lt;i&gt;Customer&lt;/i&gt;. &lt;/p&gt;
&lt;p&gt;Obviously the drawback to this approach is that all the instances are retained in memory, along with all their associated properties, including the text.
&lt;/p&gt;
&lt;h1&gt;Constructing a persisted full text index&lt;/h1&gt;
&lt;p&gt;Full text indexes can be created by passing the path to the persisted file into the constructor:&lt;/p&gt;
&lt;pre&gt;var indexFilePath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
    Path.Combine(&amp;quot;MyApplication&amp;quot;, &amp;quot;MyTextIndex.dat&amp;quot;);

var index = new PersistedFullTextIndex&amp;lt;int&amp;gt;(indexFilePath);&lt;/pre&gt;
&lt;p&gt;As with the FullTextIndex and UpdatableFullTextIndex, the persisted full index is a generic type. It is strongly recommended that you use a key-based approach to the index, by restricting the type that you store in the index to a primitive type, e.g. int,
 string, etc.&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 09 Jun 2011 21:08:21 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Constructing a full text indexes 20110609090821P</guid></item><item><title>Updated Wiki: Constructing an in-memory full text index</title><link>http://lifti.codeplex.com/wikipage?title=Constructing an in-memory full text index&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Constructing an in-memory full text index&lt;/h1&gt;
&lt;p&gt;The code to create a new full text index class looks like this:&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;MyType&amp;gt;(); 
var updatableIndex = new UpdatableFullTextIndex&amp;lt;MyType&amp;gt;();&lt;/pre&gt;
&lt;p&gt;From this you can see that all forms of the full text index class are generic types defining the type of item that the index will contain.&lt;/p&gt;
&lt;p&gt;There are two approaches that you can take to indexing items: indexing keys and indexing .NET objects.
&lt;/p&gt;
&lt;h2&gt;Indexing keys&lt;/h2&gt;
&lt;p&gt;The first approach is to index a unique key for your items. This means that the index itself will only store a
&lt;i&gt;reference&lt;/i&gt; or id to the indexed item. This might be an integer, a string, a Guid or other primitive type.
&lt;br&gt;
The constructor for this approach looks like this (Note that the FullTextIndex generic type is
&lt;i&gt;int&lt;/i&gt;): &lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;int&amp;gt;()&lt;/pre&gt;
&lt;p&gt;The main benefit to this approach is that once an item has been indexed the associated text doesn’t need to be retained in memory.&lt;/p&gt;
&lt;h2&gt;Indexing .NET objects&lt;/h2&gt;
&lt;p&gt;If your items are always loaded into memory and they contain all the text that you want to index, you can index them directly:&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;Customer&amp;gt;();&lt;/pre&gt;
&lt;p&gt;Here the generic type of FullTextIndex is &lt;i&gt;Customer&lt;/i&gt;. &lt;/p&gt;
&lt;p&gt;Obviously the drawback to this approach is that all the instances are retained in memory, along with all their associated properties, including the text.
&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 09 Jun 2011 18:15:02 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Constructing an in-memory full text index 20110609061502P</guid></item><item><title>Updated Wiki: Temporary Post Used For Theme Detection (64b6ffae-5ded-44c1-b553-8dcf597ee12b - 3bfe001a-32de-4114-a6b4-4005b770f6d7)</title><link>http://lifti.codeplex.com/wikipage?title=Temporary Post Used For Theme Detection (64b6ffae-5ded-44c1-b553-8dcf597ee12b - 3bfe001a-32de-4114-a6b4-4005b770f6d7)&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;This is a temporary post that was not deleted. Please delete this manually. (aa2e0171-ac71-4684-a238-08240730f1f4 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 09 Jun 2011 18:03:52 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Temporary Post Used For Theme Detection (64b6ffae-5ded-44c1-b553-8dcf597ee12b - 3bfe001a-32de-4114-a6b4-4005b770f6d7) 20110609060352P</guid></item><item><title>Updated Wiki: Using the LIFTI query language</title><link>http://lifti.codeplex.com/wikipage?title=Using the LIFTI query language&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;The LIFTI Query Language&lt;/h1&gt;
When you have constructed a &lt;b&gt;FullTextIndexer&lt;/b&gt; instance and set its QueryParser property to a
&lt;b&gt;LiftiQueryParser&lt;/b&gt;, you will be able to search the full text index using the LIFTI query language. This will allow you to write queries using the following operators:
&lt;br&gt;
&lt;br&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Query &lt;/th&gt;
&lt;th&gt;Meaning &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;West &lt;/td&gt;
&lt;td&gt;&lt;b&gt;West&lt;/b&gt; must appear in the text. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;doc* &lt;/td&gt;
&lt;td&gt;Words that starts with &lt;b&gt;doc&lt;/b&gt; must appear in the text. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;west &amp;amp; wing &lt;/td&gt;
&lt;td&gt;The words &lt;b&gt;west&lt;/b&gt; and &lt;b&gt;wing&lt;/b&gt; must appear in the text &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;west wing &lt;/td&gt;
&lt;td&gt;The words &lt;b&gt;west&lt;/b&gt; and &lt;b&gt;wing&lt;/b&gt; must appear in the text - the default operator is &amp;amp; if none is specified between search words
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;west | wing &lt;/td&gt;
&lt;td&gt;The words &lt;b&gt;west&lt;/b&gt; or &lt;b&gt;wing&lt;/b&gt; must appear in the text &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;west ~ wing &lt;/td&gt;
&lt;td&gt;&lt;b&gt;west&lt;/b&gt; and &lt;b&gt;wing&lt;/b&gt; must appear near to each other (within 5 words) in the text
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;west ~&amp;gt; wing &lt;/td&gt;
&lt;td&gt;&lt;b&gt;west&lt;/b&gt; must be closely followed by &lt;b&gt;wing&lt;/b&gt; (within 5 words) in the text
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;west &amp;gt;&amp;gt; wing &lt;/td&gt;
&lt;td&gt;&lt;b&gt;west&lt;/b&gt; must precede &lt;b&gt;wing&lt;/b&gt; anywhere in the text &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;the west wing&amp;quot; &lt;/td&gt;
&lt;td&gt;The words &lt;b&gt;the west wing&lt;/b&gt; must appear in sequence in the indexed text. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;notr* dam*&amp;quot; &lt;/td&gt;
&lt;td&gt;A word starting with &lt;b&gt;notr&lt;/b&gt; must be immediately followed by a word starting with dam.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
If you specify two search words in a query without a joining operator, then they will automatically be combined with an and (&amp;amp;) operator, so the queries
&lt;b&gt;west &amp;amp; wing&lt;/b&gt; is equivalent to &lt;b&gt;west wing&lt;/b&gt;. (Just to clarify, searching for
&lt;b&gt;&amp;quot;west wing&amp;quot;&lt;/b&gt; is different - this indicates that the words should appear in sequence - the previous searches only enforce that the words appear
&lt;b&gt;somewhere&lt;/b&gt; in the text.) &lt;br&gt;
&lt;h2&gt;Longer queries&lt;/h2&gt;
Query operators can be combined, so you can write a query such as &lt;b&gt;the &amp;amp; west &amp;amp; wing&lt;/b&gt; to search for items that have all 3 words indexed against them.
&lt;br&gt;
Naturally you can mix and match operators, so &lt;b&gt;&amp;quot;west wing&amp;quot; &amp;amp; &amp;quot;oval office&amp;quot;&lt;/b&gt; would search for items with the phrases &amp;quot;west wing&amp;quot; and &amp;quot;oval office&amp;quot; indexed against them.
&lt;br&gt;
When combining operators you need to be aware of operator precedence. Operators will be processed in the following order:
&lt;ol&gt;
&lt;li&gt;Positional operators (~, ~&amp;gt; and &amp;gt;&amp;gt;) &lt;/li&gt;&lt;li&gt;And (&amp;amp;) &lt;/li&gt;&lt;li&gt;Or (|) &lt;/li&gt;&lt;/ol&gt;
&lt;br&gt;
This means that &lt;b&gt;west &amp;amp; wing | oval office&lt;/b&gt; would search for items containing both
&lt;b&gt;west&lt;/b&gt; and &lt;b&gt;wing&lt;/b&gt;, or items containing &lt;b&gt;oval&lt;/b&gt; and &lt;b&gt;office&lt;/b&gt;. &lt;br&gt;
&lt;br&gt;
You can specify your own precedence by using brackets &lt;br&gt;
This means that you could write &lt;b&gt;west &amp;amp; (wing | oval) &amp;amp; office&lt;/b&gt; to search for items containing
&lt;b&gt;west&lt;/b&gt; and &lt;b&gt;office&lt;/b&gt; and either &lt;b&gt;wing&lt;/b&gt; or &lt;b&gt;oval&lt;/b&gt;. &lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 09 Jun 2011 15:58:06 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Using the LIFTI query language 20110609035806P</guid></item><item><title>Updated Wiki: Word splitters</title><link>http://lifti.codeplex.com/wikipage?title=Word splitters&amp;version=3</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Word splitters&lt;/h1&gt;
&lt;p&gt;In LIFTI a word splitter is a class implementing &lt;b&gt;IWordSplitter&lt;/b&gt; - these classes are capable of breaking a piece of text into individual words that should be contained in the index. There are currently three word splitters defined in the LIFTI assembly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WordSplitter&lt;/strong&gt; (Currently the default) &lt;/li&gt;&lt;li&gt;&lt;b&gt;StemmingWordSplitter&lt;/b&gt; &lt;/li&gt;&lt;li&gt;&lt;strong&gt;XmlWordSplitter&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Word splitters are used in two parts of the LIFTI code: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;During the indexing process - to split the text associated to an item into constituent words.
&lt;/li&gt;&lt;li&gt;During the searching process - search words are also passed through a splitter, ensuring that adjustments made to a word when it was indexed are also applied to these criteria.
&lt;/li&gt;&lt;/ol&gt;
You can set the word splitter on an index using the &lt;b&gt;WordSplitter&lt;/b&gt; property:
&lt;br&gt;
&lt;pre&gt;index.WordSplitter = new StemmingWordSplitter(); &lt;/pre&gt;
&lt;p&gt;If you need different behaviour to be applied to the indexing and searching process, then you can additionally set the
&lt;strong&gt;SearchWordSplitter&lt;/strong&gt; property. If SearchWordSplitter is left null it defaults to the value held against the WordSplitter property, meaning that you won’t normally need to set it. The XmlWordSplitter section of this page shows an example of when
 you might use the SearchWordSplitter property.&lt;/p&gt;
&lt;h2&gt;WordSplitter&lt;/h2&gt;
&lt;p&gt;This is the default word splitter that a LIFTI full text index is constructed with. It simply breaks a string apart on white spaces. Characters that are not letters or digits are treated as whitespace, apart from apostrophes which are just ignored. This
 means that the following statement:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Simon's latest phrase is &amp;quot;Simon’s space-monkeys rule&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Would be broken into the following words: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simons &lt;/li&gt;&lt;li&gt;latest &lt;/li&gt;&lt;li&gt;phrase &lt;/li&gt;&lt;li&gt;is &lt;/li&gt;&lt;li&gt;space &lt;/li&gt;&lt;li&gt;monkeys &lt;/li&gt;&lt;li&gt;rule &lt;/li&gt;&lt;/ul&gt;
Each word is returned only once as an instance of &lt;b&gt;SplitWord&lt;/b&gt;, which also provides an array of integers indicating the positions in the document at which the words were encountered. For the word “Simons” above, that array would have contained 0 and 4.
&lt;h2&gt;StemmingWordSplitter&lt;/h2&gt;
&lt;p&gt;The stemming word splitter breaks words apart using the same rules as the standard word splitter. Each individual word is subsequently processed using an implementation of a Porter stemmer which strips off word suffixes. For example,
&lt;strong&gt;connection&lt;/strong&gt;, &lt;strong&gt;connects&lt;/strong&gt; and &lt;strong&gt;connecting&lt;/strong&gt; all become
&lt;strong&gt;connect&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Although this incurs a small cost, it also makes the index more accessible when the text being indexed is free-form English, as the user is more likely to get relevant results. Additionally it has the effect of making the index smaller, as the number and
 length of indexed words will be reduced. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Currently only English words are officially supported, as the stemming algorithms differ between languages.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;XmlWordSplitter&lt;/h2&gt;
&lt;p&gt;The XML word splitter is designed to only return words that appear in text content contained within nodes in an XML document.&lt;/p&gt;
&lt;p&gt;Consider the following XML:&lt;/p&gt;
&lt;pre&gt;&amp;lt;document type=&amp;quot;phrase&amp;quot;&amp;gt;
    &lt;strong&gt;The quick brown&lt;/strong&gt; &amp;lt;emphasis&amp;gt;&lt;strong&gt;fox&lt;/strong&gt;&amp;lt;/emphasis&amp;gt; &lt;strong&gt;jumped&lt;/strong&gt;
    &lt;strong&gt;over the lazy&lt;/strong&gt; &amp;lt;emphasis&amp;gt;&lt;strong&gt;dog&lt;/strong&gt;&amp;lt;/emphasis&amp;gt;.
&amp;lt;/document&amp;gt;&lt;/pre&gt;
&lt;p&gt;When run through the XML word splitter, the following words (and associated positions) will be returned:&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;&lt;strong&gt;Word&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="200"&gt;&lt;strong&gt;Word index&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;THE&lt;/td&gt;
&lt;td valign="top" width="200"&gt;0, 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;QUICK&lt;/td&gt;
&lt;td valign="top" width="200"&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;BROWN&lt;/td&gt;
&lt;td valign="top" width="200"&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;FOX&lt;/td&gt;
&lt;td valign="top" width="200"&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;JUMPED&lt;/td&gt;
&lt;td valign="top" width="200"&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;OVER&lt;/td&gt;
&lt;td valign="top" width="200"&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;LAZY&lt;/td&gt;
&lt;td valign="top" width="200"&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;DOG&lt;/td&gt;
&lt;td valign="top" width="200"&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Notice that the word “the” is reported at positions 0 and 6 – the word index is relative to first word in the document, regardless of whether there are XML elements that interrupt the flow of the text.&lt;/p&gt;
&lt;p&gt;One thing to consider when using the XmlWordSplitter is that you probably won’t want
&lt;/p&gt;
&lt;p&gt;When you construct an XmlWordSplitter instance, you need to specify the type of word splitting behaviour that should be applied to the chunks of text within the XML document itself.
&lt;/p&gt;
&lt;p&gt;This example shows how you would configure an index to use an XmlWordSplitter that stems the words that it returns using a StemmingWordSplitter:&lt;/p&gt;
&lt;pre&gt;var wordSplitter = new StemmingWordSplitter();
index.WordSplitter = new XmlWordSplitter(wordSplitter);
index.SearchWordSplitter = wordSplitter;&lt;/pre&gt;
&lt;p&gt;Here you can see usage of the SearchWordSplitter property of the index to differentiate the indexing and searching word splitting behaviours. If you really wanted to search using XML text as well, then you wouldn’t need to specify SearchWordSplitter.&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 09 Jun 2011 15:54:19 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Word splitters 20110609035419P</guid></item><item><title>Updated Wiki: Quick Start</title><link>http://lifti.codeplex.com/wikipage?title=Quick Start&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Quick start&lt;/h1&gt;
&lt;h2&gt;Using LIFTI to index .NET classes in-memory&lt;/h2&gt;
&lt;p&gt;The LIFTI API is really straightforward to use, a simple example would be: &lt;/p&gt;
&lt;pre&gt;// People is a class defined with properties Name and Remarks
IEnumerable&amp;lt;Person&amp;gt; people = LoadPeople(); 

// Create the index
var index = new FullTextIndex&amp;lt;Person&amp;gt;(); 

// Index the people against the text in their remarks data
index.Index(people, p =&amp;gt; p.Remarks);

// Search for all the people with &amp;quot;great&amp;quot; and &amp;quot;boss&amp;quot; in their remarks (in any order)
foreach (Person person in index.Search(&amp;quot;great boss&amp;quot;))
{
    Console.WriteLine(person.Name); 
}&lt;/pre&gt;
&lt;p&gt;By default the full text index will not handle word derivatives, e.g. searching for CALLING will not return items indexed against the word CALL or CALLED. LIFTI provides a stemming word splitter which enables this kind of searching - to enable it just change
 the full text index constructor to:&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;Person&amp;gt;()
{
    WordSplitter = new StemmingWordSplitter()
};&lt;/pre&gt;
&lt;p&gt;You can also use a richer querying syntax to search the index if you want, just change the index so it is using an instance of the LiftiQueryParser class:&lt;/p&gt;
&lt;pre&gt;var index = new FullTextIndex&amp;lt;Person&amp;gt;()
{
    WordSplitter = new StemmingWordSplitter(),
    QueryParser = new LiftiQueryParser()
};&lt;/pre&gt;
&lt;h3&gt;Updatable indexes&lt;/h3&gt;
&lt;p&gt;The FullTextIndex class doesn’t allow items to be modified once they are index – it is essentially write-once-per-item. If you need to be able to index the same item again, or remove an item from the index, then you can use the UpdatableFullTextIndex class
 instead.&lt;/p&gt;
&lt;h2&gt;Using LIFTI to create a persisted full text index&lt;/h2&gt;
&lt;p&gt;The FullTextIndex and UpdatableFullTextIndex classes require fully re-populating every time your application starts. If you want your index to be persisted across application restarts, you can use the PersistedFullTextIndex class instead. In this case you
 will typically want to store the id of the related item in the index - following on from the previous examples, this might be an PersonId of type Int32:&lt;/p&gt;
&lt;pre&gt;// Create the index - this will automatically load any data that was previously indexed
var index = new PersistedFullTextIndex&amp;lt;int&amp;gt;(@&amp;quot;c:\MyIndexData\PeopleIndex.dat&amp;quot;)
{
    WordSplitter = new StemmingWordSplitter()
}; 

// Index new or updated people
index.Index(people, p =&amp;gt; p.PersonId, p =&amp;gt; p.Remarks);

// Search for all the people with &amp;quot;great&amp;quot; and &amp;quot;boss&amp;quot; in their remarks (in any order)
foreach (Person person in index.Search(&amp;quot;great boss&amp;quot;))
{
    Console.WriteLine(person.Name); 
}&lt;/pre&gt;
&lt;p&gt;Indexes aren’t restricted to storing integers as keys – you can quite easily store strings or other value types. This final example indexes the paths to documents against the text that they contain:&lt;/p&gt;
&lt;pre&gt;private PersistedFullTextIndex&amp;lt;string&amp;gt; index;

void Main()
{
    this.index = new PersistedFullTextIndex&amp;lt;string&amp;gt;(@&amp;quot;c:\MyIndexData\DocumentIndex.dat&amp;quot;)
    {
        WordSplitter = new StemmingWordSplitter(),
        QueryParser = new LiftiQueryParser()
    };

    this.index.Index(Directory.GetFiles(@&amp;quot;c:\MyDocumentStore&amp;quot;), f =&amp;gt; File.ReadAllText(f));

    Console.WriteLine(&amp;quot;Searching for documents containing the words 'design' and 'document'&amp;quot;);
    foreach (var fileName in this.index.Search(&amp;quot;design &amp;amp; document&amp;quot;))
    {
        Console.WriteLine(&amp;quot;Document file name:&amp;quot;, fileName);
    }
}&lt;/pre&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Thu, 09 Jun 2011 09:55:20 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Quick Start 20110609095520A</guid></item><item><title>Updated Wiki: Home</title><link>http://lifti.codeplex.com/wikipage?version=11</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;b&gt;Project Description&lt;/b&gt; &lt;br&gt;
LIFTI provides a simple API that allows you to build a searchable full text index. This can be useful for document retrieval or simply allowing .NET objects to be searched for by associated text.
&lt;/p&gt;
&lt;p&gt;Version 0.5 of the library introduces the PersistedFullTextIndex which automatically persists the index to a backing file store as it is being used. This opens up the possibility of using it in an application to index text associated to data stored in a
 database that doesn’t provide its own full text indexing services, such as SQL Server Compact.&lt;/p&gt;
&lt;p&gt;There are 3 samples (4 if you count the timing comparison application) included in the solution – these should give you a pretty good idea how to get started. They’re also included as binaries in the download.
&lt;br&gt;
&lt;br&gt;
This project started as a &lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx" target="_blank"&gt;
single blog entry&lt;/a&gt; and has grown into something that may actually be genuinely useful. The basic principle behind LIFTI is that it allows you to index items (or their keys) against text associated to them - once the text has been indexed it is stored in
 a compact and searchable form, meaning that the overall text for each item need not be persisted.
&lt;br&gt;
&lt;br&gt;
&lt;del&gt;The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is slowly coming together - I'd be interested in getting feedback regarding any holes that are missing.&lt;/del&gt;
&lt;br&gt;
&lt;b&gt;The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is now out of date since the 0.5 release – I'll be updating it over the next couple of days&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;LIFTI is currently compiled against version 3.5 of the .NET Framework – I’m probably going to be moving it to version 4.0 in the next release – if you want to influence this in one way or the other make your
&lt;a href="http://lifti.codeplex.com/discussions/257442" target="_blank"&gt;thoughts known&lt;/a&gt;!
&lt;br&gt;
&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;My blog (&lt;a href="http://www.goatly.net"&gt;http://www.goatly.net&lt;span&gt;&lt;/span&gt;&lt;/a&gt;) is where a lot of articles about LIFTI have, and will continue, to appear.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/6/8/changes-to-the-lifti-api.aspx" target="_blank"&gt;Discussion of the breaking changes between versions 0.4 and 0.5&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Older links&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx"&gt;This original article describing the initial intentions of this project&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/12/7/lifti-and-porter-stemming.aspx"&gt;This article explains the new word stemming features available in LIFTI&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/11/18/lifti-searching-pascal-cased-words.aspx"&gt;An example of using a custom word splitter to index Pascal-cased words&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/1/5/lifti-changes-ahoy.aspx"&gt;An article discussing the querying, updatable index and serialization changes&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Wed, 08 Jun 2011 22:17:47 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110608101747P</guid></item><item><title>Updated Wiki: Home</title><link>http://lifti.codeplex.com/wikipage?version=10</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;b&gt;Project Description&lt;/b&gt; &lt;br&gt;
LIFTI provides a simple API that allows you to build a searchable full text index. This can be useful for document retrieval or simply allowing .NET objects to be searched for by associated text.
&lt;/p&gt;
&lt;p&gt;Version 0.5 of the library introduces the PersistedFullTextIndex which automatically persists the index to a backing file store as it is being used. This opens up the possibility of using it in an application to index text associated to data stored in a
 database that doesn’t provide its own full text indexing services, such as SQL Server Compact.
&lt;br&gt;
&lt;br&gt;
This project started as a &lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx" target="_blank"&gt;
single blog entry&lt;/a&gt; and has grown into something that may actually be genuinely useful.
&lt;br&gt;
&lt;br&gt;
The basic principle behind LIFTI is that it allows you to index items (or their keys) against text associated to them - once the text has been indexed it is stored in a compact and searchable form, meaning that the overall text for each item need not be persisted.
&lt;br&gt;
&lt;br&gt;
&lt;del&gt;The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is slowly coming together - I'd be interested in getting feedback regarding any holes that are missing.&lt;/del&gt;
&lt;br&gt;
&lt;b&gt;Important: The &lt;a href="/lifti/documentation?referringTitle=Home"&gt;documentation&lt;/a&gt; is now out of date since the 0.5 release - I'll update it very shortly.&lt;/b&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;My blog (&lt;a href="http://www.goatly.net"&gt;http://www.goatly.net&lt;span&gt;&lt;/span&gt;&lt;/a&gt;) is where a lot of articles about LIFTI have, and will continue, to appear.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2011/6/8/changes-to-the-lifti-api.aspx" target="_blank"&gt;Discussion of the breaking changes between versions 0.4 and 0.5&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Older links&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.goatly.net/2010/1/29/creating-a-lightweight-in-memory-full-text-indexer.aspx"&gt;This original article describing the initial intentions of this project&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/12/7/lifti-and-porter-stemming.aspx"&gt;This article explains the new word stemming features available in LIFTI&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2010/11/18/lifti-searching-pascal-cased-words.aspx"&gt;An example of using a custom word splitter to index Pascal-cased words&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.goatly.net/2011/1/5/lifti-changes-ahoy.aspx"&gt;An article discussing the querying, updatable index and serialization changes&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Wed, 08 Jun 2011 21:59:50 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110608095950P</guid></item><item><title>Updated Wiki: Using the FullTextIndexer class</title><link>http://lifti.codeplex.com/wikipage?title=Using the FullTextIndexer class&amp;version=2</link><description>&lt;div class="wikidoc"&gt;The LIFTI API is really straightforward to use, a simple example would be: &lt;br&gt;
&lt;br&gt;
&lt;pre&gt;// People is an imaginary class with properties Name and Remarks
// People will be indexed on the text in their remarks data
IEnumerable&amp;lt;Person&amp;gt; people = LoadPeople(); 

FullTextIndexer&amp;lt;Person&amp;gt; indexer = new FullTextIndexer&amp;lt;Person&amp;gt;(p =&amp;gt; p.Remarks); 
indexer.Index(people); // Index the loaded people

// Search for all the people with &amp;quot;great&amp;quot; and &amp;quot;boss&amp;quot; in their remarks (in any order)
foreach (Person person in indexer.Search(&amp;quot;great boss&amp;quot;))
{
    Console.WriteLine(person.Name); 
}&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
By default the full text indexer will not handle word derivatives, e.g. searching for CALLING will not return items indexed against the word CALL or CALLED. In v0.2 LIFTI provides a stemming word splitter which enables this kind of searching - to enable it
 just change the full text indexer constructor to: &lt;br&gt;
&lt;br&gt;
&lt;pre&gt;FullTextIndexer&amp;lt;Person&amp;gt; indexer = new FullTextIndexer&amp;lt;Person&amp;gt;(p =&amp;gt; p.Remarks)
{
    WordSplitter = new StemmingWordSplitter()
}; &lt;/pre&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>MikeGoatly</author><pubDate>Tue, 07 Jun 2011 21:31:39 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Using the FullTextIndexer class 20110607093139P</guid></item></channel></rss>