                      Apache Solr Version 1.3.0
                            Release Notes

Introduction
------------
Apache Solr is an open source enterprise search server based on the Lucene Java
search library, with XML/HTTP and JSON APIs, hit highlighting, faceted search,
caching, replication, and a web administration interface. It runs in a Java
servlet container such as Tomcat.

See http://lucene.apache.org/solr for more information.


Getting Started
---------------
You need a Java 1.5 VM or later installed.
In this release, there is an example Solr server including a bundled 
servlet container in the directory named "example".
See the tutorial at http://lucene.apache.org/solr/tutorial.html


$Id$

================== Release 1.3.0 ==================


Upgrading from Solr 1.2
-----------------------
IMPORTANT UPGRADE NOTE: In a master/slave configuration, all searchers/slaves
should be upgraded before the master!  If the master were to be updated
first, the older searchers would not be able to read the new index format.

The Porter snowball based stemmers in Lucene were updated (LUCENE-1142),
and are not guaranteed to be backward compatible at the index level
(the stem of certain words may have changed).  Re-indexing is recommended.

Older Apache Solr installations can be upgraded by replacing
the relevant war file with the new version.  No changes to configuration
files should be needed.  

This version of Solr contains a new version of Lucene implementing
an updated index format.  This version of Solr/Lucene can still read
and update indexes in the older formats, and will convert them to the new
format on the first index change.  Be sure to backup your index before 
upgrading in case you need to downgrade.

Solr now recognizes HTTP Request headers related to HTTP Caching (see
RFC 2616 sec13) and will by default respond with "304 Not Modified"
when appropriate.  This should only affect users who access Solr via
an HTTP Cache, or via a Web-browser that has an internal cache, but if
you wish to suppress this behavior an '<httpCaching never304="true"/>'
option can be added to your solrconfig.xml.  See the wiki (or the
example solrconfig.xml) for more details...  
   http://wiki.apache.org/solr/SolrConfigXml#HTTPCaching

In Solr 1.2, DateField did not enforce the canonical representation of
the ISO 8601 format when parsing incoming data, and did not generation
the canonical format when generating dates from "Date Math" strings
(particularly as it pertains to milliseconds ending in trailing zeros)
-- As a result equivalent dates could not always be compared properly.
This problem is corrected in Solr 1.3, but DateField users that might
have been affected by indexing inconsistent formats of equivilent
dates (ie: 1995-12-31T23:59:59Z vs 1995-12-31T23:59:59.000Z) may want
to consider reindexing to correct these inconsistencies.  Users who
depend on some of the the "broken" behavior of DateField in Solr 1.2
(specificly: accepting any input that ends in a 'Z') should consider
using the LegacyDateField class as a possible alternative.  Users that
desire 100% backwards compatibility should consider using the Solr 1.2
version of DateField.

Due to some changes in the lifecycle of TokenFilterFactories, users of
Solr 1.2 who have written Java code which constructs new instances of
StopFilterFactory, SynonymFilterFactory, or EnglishProterFilterFactory
will need to modify their code by adding a line like the following
prior to using the factory object...   
  factory.inform(SolrCore.getSolrCore().getSolrConfig().getResourceLoader()); 
These lifecycle changes do not affect people who use Solr "out of the
box" or who have developed their own TokenFilterFactory plugins. More
info can be found in SOLR-594.

The python client that used to ship with Solr is no longer included in 
the distribution (see client/python/README.txt).
   
Detailed Change List
--------------------

New Features
 1. SOLR-69: Adding MoreLikeThisHandler to search for similar documents using
    lucene contrib/queries MoreLikeThis.  MoreLikeThis is also available from
    the StandardRequestHandler using ?mlt=true. (bdelacretaz, ryan)

 2. SOLR-253: Adding KeepWordFilter and KeepWordFilterFactory.  A TokenFilter
    that keeps tokens with text in the registered keeplist.  This behaves like
    the inverse of StopFilter. (ryan)

 3. SOLR-257: WordDelimiterFilter has a new parameter splitOnCaseChange,
    which can be set to 0 to disable splitting "PowerShot" => "Power" "Shot".
    (klaas)
    
 4. SOLR-193: Adding SolrDocument and SolrInputDocument to represent documents
    outside of the lucene Document infrastructure.  This class will be used 
    by clients and for processing documents. (ryan) 

 5. SOLR-244: Added ModifiableSolrParams - a SolrParams implementation that 
    help you change values after initialization. (ryan)

 6. SOLR-20: Added a java client interface with two implementations.  One 
    implementation uses commons httpclient to connect to solr via HTTP.  The 
    other connects to solr directly.  Check client/java/solrj.  This addition
    also includes tests that start jetty and test a connection using the full
    HTTP request cycle.  (Darren Erik Vengroff, Will Johnson, ryan)
 
 7. SOLR-133: Added StaxUpdateRequestHandler that uses StAX for XML parsing.
    This implementation has much better error checking and lets you configure
    a custom UpdateRequestProcessor that can selectively process update 
    requests depending on the request attributes.  This class will likely 
    replace XmlUpdateRequestHandler.  (Thorsten Scherler, ryan)

 8. SOLR-264: Added RandomSortField, a utility field with a random sort order.
    The seed is based on a hash of the field name, so a dynamic field
    of this type is useful for generating different random sequences.
    This field type should only be used for sorting or as a value source
    in a FunctionQuery (ryan, hossman, yonik) 

 9. SOLR-266: Adding show=schema to LukeRequestHandler to show the parsed
    schema fields and field types.  (ryan)

10. SOLR-133: The UpdateRequestHandler now accepts multiple delete options 
    within a single request.  For example, sending:
     <delete><id>1</id><id>2</id></delete> will delete both 1 and 2. (ryan)

11. SOLR-269: Added UpdateRequestProcessor plugin framework.  This provides
    a reasonable place to process documents after they are parsed and 
    before they are committed to the index.  This is a good place for custom 
    document manipulation or document based authorization. (yonik, ryan)

12. SOLR-260: Converting to a standard PluginLoader framework.  This reworks
    RequestHandlers, FieldTypes, and QueryResponseWriters to share the same
    base code for loading and initializing plugins.  This adds a new 
    configuration option to define the default RequestHandler and 
    QueryResponseWriter in XML using default="true".  (ryan)

13. SOLR-225: Enable pluggable highlighting classes.  Allow configurable
    highlighting formatters and Fragmenters.  (ryan)

14. SOLR-273/376/452/516: Added hl.maxAnalyzedChars highlighting parameter, defaulting 
    to 50k, hl.alternateField, which allows the specification of a backup
    field to use as summary if no keywords are matched, and hl.mergeContiguous,
    which combines fragments if they are adjacent in the source document.
    (klaas, Grant Ingersoll, Koji Sekiguchi via klaas)

15. SOLR-291: Control maximum number of documents to cache for any entry
    in the queryResultCache via queryResultMaxDocsCached solrconfig.xml 
    entry. (Koji Sekiguchi via yonik)

16. SOLR-240: New <lockType> configuration setting in <mainIndex> and
    <indexDefaults> blocks supports all Lucene builtin LockFactories.
    'single' is recommended setting, but 'simple' is default for total
    backwards compatibility.
    (Will Johnson via hossman)
    
17. SOLR-248: Added CapitalizationFilterFactory that creates tokens with 
    normalized capitalization.  This filter is useful for facet display,
    but will not work with a prefix query.  (ryan)
    SOLR-468: Change to the semantics to keep the original token, not the token in the Map.  Also switched to
    use Lucene's new reusable token capabilities.  (gsingers)

18. SOLR-307: Added NGramFilterFactory and EdgeNGramFilterFactory.
    (Thomas Peuss via Otis Gospodnetic)

19. SOLR-305: analysis.jsp can be given a fieldtype instead of a field
    name.  (hossman)

20. SOLR-102: Added RegexFragmenter, which splits text for highlighting
    based on a given pattern.  (klaas)

21. SOLR-258: Date Faceting added to SimpleFacets.  Facet counts
    computed for ranges of size facet.date.gap (a DateMath expression) 
    between facet.date.start and facet.date.end.  (hossman)

22. SOLR-196: A PHP serialized "phps" response writer that returns a
    serialized array that can be used with the PHP function unserialize,
    and a PHP response writer "php" that may be used by eval.
    (Nick Jenkin, Paul Borgermans, Pieter Berkel via yonik)

23. SOLR-308: A new UUIDField class which accepts UUID string values, 
    as well as the special value of "NEW" which triggers generation of 
    a new random UUID.
    (Thomas Peuss via hossman)

24. SOLR-349: New FunctionQuery functions: sum, product, div, pow, log,
    sqrt, abs, scale, map.  Constants may now be used as a value source.
    (yonik)

25. SOLR-359: Add field type className to Luke response, and enabled access
    to the detailed field information from the solrj client API.
    (Grant Ingersoll via ehatcher)

26. SOLR-334: Pluggable query parsers.  Allows specification of query
    type and arguments as a prefix on a query string. (yonik)

27. SOLR-351: External Value Source.  An external file may be used
     to specify the values of a field, currently usable as
     a ValueSource in a FunctionQuery. (yonik)

28. SOLR-395: Many new features for the spell checker implementation, including
    an extended response mode with much richer output, multi-word spell checking,
    and a bevy of new and renamed options (see the wiki).
    (Mike Krimerman, Scott Taber via klaas).

29. SOLR-408: Added PingRequestHandler and deprecated SolrCore.getPingQueryRequest().
    Ping requests should be configured using standard RequestHandler syntax in
    solrconfig.xml rather then using the <pingQuery></pingQuery> syntax.
    (Karsten Sperling via ryan)

30. SOLR-281: Added a 'Search Component' interface and converted StandardRequestHandler
    and DisMaxRequestHandler to use this framework.  
    (Sharad Agarwal, Henri Biestro, yonik, ryan) 
    
31. SOLR-176: Add detailed timing data to query response output.  The SearchHandler
    interface now returns how long each section takes.  (klaas)
    
32. SOLR-414: Plugin initialization now supports SolrCore and ResourceLoader "Aware" 
    plugins.  Plugins that implement SolrCoreAware or ResourceLoaderAware are 
    informed about the SolrCore/ResourceLoader. (Henri Biestro, ryan)

33. SOLR-350: Support multiple SolrCores running in the same solr instance and allows
    runtime runtime management for any running SolrCore.  If a solr.xml file exists 
    in solr.home, this file is used to instanciate multiple cores and enables runtime 
    core manipulation.  For more informaion see:  http://wiki.apache.org/solr/CoreAdmin  
    (Henri Biestro, ryan)

34. SOLR-447: Added an single request handler that will automatically register all
    standard admin request handlers.  This replaces the need to register (and maintain)
    the set of admin request handlers.  Assuming solrconfig.xml includes:
     <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
    This will register: Luke/SystemInfo/PluginInfo/ThreadDump/PropertiesRequestHandler.
    (ryan)
    
35. SOLR-142: Added RawResponseWriter and ShowFileRequestHandler.  This returns config
    files directly.  If AdminHandlers are configured, this will be added automatically.
    The jsp files /admin/get-file.jsp and /admin/raw-schema.jsp have been deprecated.
    The deprecated <admin><gettableFiles> will be automatically registered with
    a ShowFileRequestHandler instance for backwards compatibility. (ryan)

36. SOLR-446: TextResponseWriter can write SolrDocuments and SolrDocumentLists the 
    same way it writes Document and DocList.  (yonik, ryan)

37. SOLR-418: Adding a query elevation component.  This is an optional component to
    elevate some documents to the top positions (or exclude them) for a given query.
    (ryan)

38. SOLR-478: Added ability to get back unique key information from the LukeRequestHandler. (gsingers)    

39. SOLR-127: HTTP Caching awareness.  Solr now recognizes HTTP Request
    headers related to HTTP Caching (see RFC 2616 sec13) and will respond
    with "304 Not Modified" when appropriate.  New options have been added
    to solrconfig.xml to influence this behavior.
    (Thomas Peuss via hossman)

40. SOLR-303: Distributed Search over HTTP.  Specification of shards
    argument causes Solr to query those shards and merge the results
    into a single response.  Querying, field faceting (sorted only),
    query faceting, highlighting, and debug information are supported
    in distributed mode.
    (Sharad Agarwal, Patrick O'Leary, Sabyasachi Dalal, Stu Hood,
     Jayson Minard, Lars Kotthoff, ryan, yonik)

41. SOLR-356: Pluggable functions (value sources) that allow 
    registration of new functions via solrconfig.xml
    (Doug Daniels via yonik)

42. SOLR-494: Added cool admin Ajaxed schema explorer.
    (Greg Ludington via ehatcher)

43. SOLR-497: Added date faceting to the QueryResponse in SolrJ
    and QueryResponseTest (Shalin Shekhar Mangar via gsingers)

44. SOLR-486: Binary response format, faster and smaller
    than XML and JSON response formats (use wt=javabin).
    BinaryResponseParser for utilizing the binary format via SolrJ
    and is now the default.
    (Noble Paul, yonik)

45. SOLR-521: StopFilterFactory support for "enablePositionIncrements"
    (Walter Ferrara via hossman)

46. SOLR-557: Added SolrCore.getSearchComponents() to return an unmodifiable Map. (gsingers)

47. SOLR-516: Added hl.maxAlternateFieldLength parameter, to set max length for hl.alternateField
    (Koji Sekiguchi via klaas)

48. SOLR-319: Changed SynonymFilterFactory to "tokenize" synonyms file.
    To use a tokenizer, specify "tokenizerFactory" attribute in <filter>.
    For example:
    <tokenizer class="solr.CJKTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" expand="true"
      ignoreCase="true" tokenizerFactory="solr.CJKTokenizerFactory"/>
    (koji)

49. SOLR-515: Added SimilarityFactory capability to schema.xml,
    making config file parameters usable in the construction of
    the global Lucene Similarity implementation.
    (ehatcher)
    
50. SOLR-536: Add a DocumentObjectBinder to solrj that converts Objects to and
    from SolrDocuments.  (Noble Paul via ryan)

51. SOLR-595: Add support for Field level boosting in the MoreLikeThis Handler.  (Tom Morton, gsingers)

52. SOLR-572: Added SpellCheckComponent and org.apache.solr.spelling package to support more spell checking functionality.
              Also includes ability to add your own SolrSpellChecker implementation that plugs in.
              See http://wiki.apache.org/solr/SpellCheckComponent for more details
              (Shalin Shekhar Mangar, Bojan Smid, gsingers)
53. SOLR-679: Added accessor methods to Lucene based spell checkers (gsingers)

54. SOLR-423: Added Request Handler close hook notification so that RequestHandlers can be notified when a core is closing.  (gsingers, ryan)

55. SOLR-603: Added ability to partially optimize. (gsingers)

56. SOLR-483: Add byte/short sorting support (gsingers)

57. SOLR-14: Add preserveOriginal flag to WordDelimiterFilter
    (Geoffrey Young, Trey Hyde, Ankur Madnani, yonik)

58. SOLR-502: Add search timeout support. (Sean Timm via yonik)
    
59. SOLR-605: Add the ability to register callbacks programatically (ryan, Noble Paul)

60. SOLR-610: hl.maxAnalyzedChars can be -1 to highlight everything (Lars Kotthoff via klaas)

61. SOLR-522: Make analysis.jsp show payloads. (Tricia Williams via yonik)

62. SOLR-611: Expose sort_values returned by QueryComponent in SolrJ's QueryResponse (Dan Rosher via shalin)

63. SOLR-256: Support exposing Solr statistics through JMX (Sharad Agrawal, shalin)

64. SOLR-666: Expose warmup time in statistics for SolrIndexSearcher and LRUCache (shalin)

65. SOLR-663: Allow multiple files for stopwords, keepwords, protwords and synonyms (Otis Gospodnetic, shalin)

66. SOLR-469: Added DataImportHandler as a contrib project which makes indexing data from Databases, XML files and HTTP
              data sources into Solr quick and easy. Includes API and implementations for supporting multiple
              data sources, processors and transformers for importing data. Supports full data imports as well as
              incremental (delta) indexing. See http://wiki.apache.org/solr/DataImportHandler for more details.
              (Noble Paul, shalin)

67. SOLR-622: SpellCheckComponent supports auto-loading indices on startup and optionally, (re)builds indices
              on newSearcher event, if configured in solrconfig.xml
              (shalin)

68. SOLR-554: Hierarchical JDK log level selector for SOLR Admin replaces logging.jsp (Sean Timm via shalin)

69. SOLR-506: Emitting HTTP Cache headers can be enabled or disabled through configuration
              on a per-handler basis (shalin)

70. SOLR-716: Added support for properties in configuration files. Properties can be specified in solr.xml
              and can be used in solrconfig.xml and schema.xml
              (Henri Biestro, hossman, ryan, shalin) 
    
Changes in runtime behavior
 1. SOLR-559: use Lucene updateDocument, deleteDocuments methods.  This
   removes the maxBufferedDeletes parameter added by SOLR-310 as Lucene
   now manages the deletes.  This provides slightly better indexing 
   performance and makes overwrites atomic, eliminating the possibility of
   a crash causing duplicates. (yonik)

 2. SOLR-689 / SOLR-695: If you have used "MultiCore" functionality in an unreleased
   version of 1.3-dev, many classes and configs have been renamed for the official 
   1.3 release.  Speciffically, solr.xml has replaced multicore.xml, and uses a slightly 
   different syntax.  The solrj classes: MultiCore{Request/Response/Params} have been 
   renamed:  CoreAdmin{Request/Response/Params}  (hossman, ryan, Henri Biestro)

 3. SOLR-647: reference count the SolrCore uses to prevent a premature
    close while a core is still in use.  (Henri Biestro, Noble Paul, yonik)

 4. SOLR-737: SolrQueryParser now uses a ConstantScoreQuery for wildcard
    queries that prevent an exception from being thrown when the number
    of matching terms exceeds the BooleanQuery clause limit.  (yonik)
    
Optimizations
 1. SOLR-276: improve JSON writer speed. (yonik)
 
 2. SOLR-310: bound and reduce memory usage by providing <maxBufferedDeletes> parameter,
    which flushes deleted without forcing the user to use <commit/> for this purpose.
    (klaas) 

 3. SOLR-348: short-circuit faceting if less than mincount docs match. (yonik)

 4. SOLR-354: Optimize removing all documents.  Now when a delete by query
    of *:* is issued, the current index is removed. (yonik)

 5. SOLR-377: Speed up response writers. (yonik)

 6. SOLR-342:  Added support into the SolrIndexWriter for using several new
 features of the new LuceneIndexWriter, including: setRAMBufferSizeMB(), setMergePolicy(), setMergeScheduler.  Also, added support
 to specify Lucene's autoCommit functionality (not to be confused with Solr's similarily named autoCommit functionality) via
  the <luceneAutoCommit> config. item.  See the test and example solrconfig.xml <indexDefaults> section for usage.  Performance during
  indexing should be significantly increased by moving up to 2.3 due to Lucene's new indexing capabilities.  Furthermore,
  the setRAMBufferSizeMB makes it more logical to decide on tuning factors related to indexing.  For best performance, leave the
  mergePolicy and mergeScheduler as the defaults and set ramBufferSizeMB instead of maxBufferedDocs.  The best value for this
    depends on the types of documents in use.  32 should be a good starting point, but reports have shown up to 48 MB provides
    good results. Note, it is acceptable to set both ramBufferSizeMB and maxBufferedDocs, and Lucene will flush based on whichever
    limit is reached first. (gsingers)
    
 7. SOLR-330: Converted TokenStreams to use Lucene's new char array based
    capabilities. (gsingers)

 8. SOLR-624: Only take snapshots if there are differences to the index (Richard Trey Hyde via gsingers)

 9. SOLR-587: Delete by Query performance greatly improved by using
    new underlying Lucene IndexWriter implementation.  (yonik)

10. SOLR-730: Use read-only IndexReaders that don't synchronize
    isDeleted().  This will speed up function queries and *:* queries
    as well as improve their scalability on multi-CPU systems.
    (Mark Miller via yonik)

Bug Fixes
 1. Make TextField respect sortMissingFirst and sortMissingLast fields.
    (J.J. Larrea via yonik)

 2. autoCommit/maxDocs was not working properly when large autoCommit/maxTime
    was specified (klaas)

 3. SOLR-283: autoCommit was not working after delete. (ryan)

 4. SOLR-286: ContentStreamBase was not using default encoding for getBytes()
    (Toru Matsuzawa via ryan)

 5. SOLR-292: Fix MoreLikeThis facet counting. (Pieter Berkel via ryan)

 6. SOLR-297: Fix bug in RequiredSolrParams where requiring a field
    specific param would fail if a general default value had been supplied.
    (hossman)

 7. SOLR-331: Fix WordDelimiterFilter handling of offsets for synonyms or 
    other injected tokens that can break highlighting. (yonik)

 8. SOLR-282: Snapshooter does not work on Solaris and OS X since the cp command
    there does not have the -l option.  Also updated commit/optimize related
    scripts to handle both old and new response format.  (bill)

 9. SOLR-294: Logging of elapsed time broken on Solaris because the date command
    there does not support the %s output format.  (bill)

10. SOLR-136: Snappuller - "date -d" and locales don't mix.  (Jürgen Hermann via    bill)

11. SOLR-333: Changed distributiondump.jsp to use Solr HOME instead of CWD to set path.
 
12. SOLR-393: Removed duplicate contentType from raw-schema.jsp. (bill)

13. SOLR-413: Requesting a large numbers of documents to be returned (limit)
    can result in an out-of-memory exception, even for a small index. (yonik)

14. The CSV loader incorrectly threw an exception when given
    header=true (the default).  (ryan, yonik)

15. SOLR-449: the python and ruby response writers are now able to correctly 
    output NaN and Infinity in their respective languages.  (klaas)

16. SOLR-42: HTMLStripReader tokenizers now preserve correct source
    offsets for highlighting.  (Grant Ingersoll via yonik)

17. SOLR-481: Handle UnknownHostException in _info.jsp (gsingers)

18. SOLR-324: Add proper support for Long and Doubles in sorting, etc. (gsingers) 

19. SOLR-496: Cache-Control max-age changed to Long so Expires
    calculation won't cause overflow.  (Thomas Peuss via hossman)

20. SOLR-535: Fixed typo (Tokenzied -> Tokenized) in schema.jsp (Thomas Peuss via billa)

21. SOLR-529: Better error messages from SolrQueryParser when field isn't
    specified and there is no defaultSearchField in schema.xml
    (Lars Kotthoff via hossman)

22. SOLR-530: Better error messages/warnings when parsing schema.xml:
    field using bogus fieldtype and multiple copyFields to a non-multiValue
    field.  (Shalin Shekhar Mangar via hossman)

23. SOLR-528: Better error message when defaultSearchField is bogus or not
    indexed.  (Lars Kotthoff via hossman)

24. SOLR-533: Fixed tests so they don't use hardcoded port numbers. 
    (hossman)

25. SOLR-400: SolrExceptionTest should now handle using OpenDNS as a DNS provider (gsingers)

26. SOLR-541: Legacy XML update support (provided by SolrUpdateServlet
    when no RequestHandler is mapped to "/update") now logs error correctly.
    (hossman)

27. SOLR-267: Changed logging to report number of hits, and also provide a mechanism to add log messages to be output by the SolrCore via a NamedList toLog
    member variable.  (Will Johnson, yseeley, gsingers)
   SOLR-267: Removed adding values to the HTTP headers in SolrDispatchFilter (gsingers)

28. SOLR-509: Moved firstSearcher event notification to the end of the SolrCore constructor (Koji Sekiguchi via gsingers)

29. SOLR-470, SOLR-552, SOLR-544, SOLR-701: Multiple fixes to DateField
    regarding lenient parsing of optional milliseconds, and correct
    formating using the canonical representation.  LegacyDateField has
    been added for people who have come to depend on the existing
    broken behavior. (hossman, Stefan Oestreicher)

30. SOLR-539: Fix for non-atomic long counters and a cast fix to avoid divide
    by zero. (Sean Timm via Otis Gospodnetic)

31. SOLR-514: Added explicit media-type with UTF* charset to *.xsl files that
    don't already have one. (hossman) 

32. SOLR-505: Give RequestHandlers the possiblity to suppress the generation
    of HTTP caching headers.  (Thomas Peuss via Otis Gospodnetic)

33. SOLR-553: Handle highlighting of phrase terms better when
    hl.usePhraseHighligher=true URL param is used.
    (Bojan Smid via Otis Gospodnetic)

34. SOLR-590: Limitation in pgrep on Linux platform breaks script-utils fixUser.    (Hannes Schmidt via billa)

35. SOLR-597: SolrServlet no longer "caches" SolrCore.  This was causing
    problems in Resin, and could potentially cause problems for customized
    usages of SolrServlet.

36. SOLR-585: Now sets the QParser on the ResponseBuilder (gsingers)

37. SOLR-604: If the spellchecking path is relative, make it relative to the Solr Data Directory.  (Shalin Shekhar Mangar via gsingers)

38. SOLR-584: Make stats.jsp and stats.xsl more robust.
    (Yousef Ourabi and hossman)

39. SOLR-443: SolrJ: Declare UTF-8 charset on POSTed parameters
    to avoid problems with servlet containers that default to latin-1
    and allow switching of the exact POST mechanism for parameters
    via useMultiPartPost in CommonsHttpSolrServer.
    (Lars Kotthoff, Andrew Schurman, ryan, yonik)

40. SOLR-556: multi-valued fields always highlighted in disparate snippets (Lars Kotthoff via klaas)

41. SOLR-501: Fix admin/analysis.jsp UTF-8 input for some other servlet
    containers such as Tomcat. (Hiroaki Kawai, Lars Kotthoff via yonik)
    
42. SOLR-616: SpellChecker accuracy configuration is not applied for FileBasedSpellChecker.
    Apply it for FileBasedSpellChecker and IndexBasedSpellChecker both.
    (shalin)
    
43. SOLR-648: SpellCheckComponent throws NullPointerException on using spellcheck.q request
    parameter after restarting Solr, if reload is called but build is not called.
    (Jonathan Lee, shalin)

44. SOLR-598: DebugComponent now always occurs last in the SearchHandler list unless the components are explicitly declared. (gsingers)

45. SOLR-676: DataImportHandler should use UpdateRequestProcessor API instead of directly using UpdateHandler. (shalin)

46. SOLR-696: Fixed bug in NamedListCodec in regards to serializing Iterable objects.  (gsingers)

47. SOLR-669: snappuler fix for FreeBSD/Darwin (Richard "Trey" Hyde via Otis Gospodnetic)

48. SOLR-606: Fixed spell check collation offset issue. (Stefan Oestreicher , Geoffrey Young, gsingers)

49. SOLR-589: Improved handling of badly formated query strings (Sean Timm via Otis Gospodnetic)

50. SOLR-749: Allow QParser and ValueSourceParsers to be extended with same name (hossman, gsingers)

Other Changes
 1. SOLR-135: Moved common classes to org.apache.solr.common and altered the
    build scripts to make two jars: apache-solr-1.3.jar and 
    apache-solr-1.3-common.jar.  This common.jar can be used in client code; 
    It does not have lucene or junit dependencies.  The original classes
    have been replaced with a @Deprecated extended class and are scheduled
    to be removed in a later release.  While this change does not affect API
    compatibility, it is recommended to update references to these
    deprecated classes.  (ryan)

 2. SOLR-268: Tweaks to post.jar so it prints the error message from Solr.
    (Brian Whitman via hossman)

 3. Upgraded to Lucene 2.2.0; June 18, 2007.

 4. SOLR-215: Static access to SolrCore.getSolrCore() and SolrConfig.config
    have been deprecated in order to support multiple loaded cores.
    (Henri Biestro via ryan)

 5. SOLR-367: The create method in all TokenFilter and Tokenizer Factories
    provided by Solr now declare their specific return types instead of just
    using "TokenStream" (hossman)

 6. SOLR-396: Hooks add to build system for automatic generation of (stub)
    Tokenizer and TokenFilter Factories.
    Also: new Factories for all Tokenizers and TokenFilters provided by the
    lucene-analyzers-2.2.0.jar -- includes support for German, Chinese,
    Russan, Dutch, Greek, Brazilian, Thai, and French.   (hossman)

 7. Upgraded to commons-CSV r609327, which fixes escaping bugs and
    introduces new escaping and whitespace handling options to
    increase compatibility with different formats.  (yonik)

 8.  Upgraded to Lucene 2.3.0; Jan 23, 2008.

 9. SOLR-451: Changed analysis.jsp to use POST instead of GET, also made the input area a bit bigger (gsingers)

10. Upgrade to Lucene 2.3.1

11. SOLR-531: Different exit code for rsyncd-start and snappuller if disabled (Thomas Peuss via billa)

12. SOLR-550: Clarified DocumentBuilder addField javadocs (gsingers)

13. Upgrade to Lucene 2.3.2

14. SOLR-518: Changed luke.xsl to use divs w/css for generating histograms
    instead of SVG  (Thomas Peuss via hossman)

15. SOLR-592: Added ShardParams interface and changed several string literals
    to references to constants in CommonParams.
    (Lars Kotthoff via Otis Gospodnetic)

16. SOLR-520: Deprecated unused LengthFilter since already core in
    Lucene-Java (hossman)

17. SOLR-645: Refactored SimpleFacetsTest (Lars Kotthoff via hossman)

18. SOLR-591: Changed Solrj default value for facet.sort to true (Lars Kotthoff via Shalin) 
    
19. Upgraded to Lucene 2.4-dev (r669476) to support SOLR-572 (gsingers)

20. SOLR-636: Improve/simplify example configs; and make index.jsp
    links more resilient to configs loaded via an InputStream
    (Lars Kotthoff, hossman)

21. SOLR-682: Scripts now support FreeBSD (Richard Trey Hyde via gsingers)

22. SOLR-489: Added in deprecation comments.  (Sean Timm, Lars Kothoff via gsingers)

23. SOLR-692: Migrated to stable released builds of StAX API 1.0.1 and StAX 1.2.0 (shalin)
24. Upgraded to Lucene 2.4-dev (r686801) (yonik)
25. Upgraded to Lucene 2.4-dev (r688745) 27-Aug-2008 (yonik)
26. Upgraded to Lucene 2.4-dev (r691741) 03-Sep-2008 (yonik)
27. Replaced the StAX reference implementation with the geronimo
    StAX API jar, and the Woodstox StAX implementation. (yonik)

Build
 1. SOLR-411.  Changed the names of the Solr JARs to use the defacto standard JAR names based on
    project-name-version.jar.  This yields, for example:
      apache-solr-common-1.3-dev.jar
      apache-solr-solrj-1.3-dev.jar
      apache-solr-1.3-dev.jar

 2. SOLR-479: Added clover code coverage targets for committers and the nightly build.  Requires the Clover library, as licensed to Apache and only available privately.  To run:
   	     ant -Drun.clover=true clean clover test generate-clover-reports

 3. SOLR-510: Nightly release includes client sources. (koji)

 4. SOLR-563: Modified the build process to build contrib projects
    (Shalin Shekhar Mangar via Otis Gospodnetic)

 5. SOLR-673: Modify build file to create javadocs for core, solrj, contrib and "all inclusive" (shalin)

 6. SOLR-672: Nightly release includes contrib sources. (Jeremy Hinegardner, shalin)

 7. SOLR-586: Added ant target and POM files for building maven artifacts of the Solr core, common,
              client and contrib. The target can publish artifacts with source and javadocs.
              (Spencer Crissman, Craig McClanahan, shalin)

================== Release 1.2, 20070602 ==================

Upgrading from Solr 1.1
-------------------------------------
IMPORTANT UPGRADE NOTE: In a master/slave configuration, all searchers/slaves
should be upgraded before the master!  If the master were to be updated
first, the older searchers would not be able to read the new index format.

Older Apache Solr installations can be upgraded by replacing
the relevant war file with the new version.  No changes to configuration
files should be needed.  

This version of Solr contains a new version of Lucene implementing
an updated index format.  This version of Solr/Lucene can still read
and update indexes in the older formats, and will convert them to the new
format on the first index change.  One change in the new index format 
is that all "norms" are kept in a single file, greatly reducing the number
of files per segment. Users of compound file indexes will want to consider
converting to the non-compound format for faster indexing and slightly better
search concurrency.

The JSON response format for facets has changed to make it easier for
clients to retain sorted order.  Use json.nl=map explicitly in clients
to get the old behavior, or add it as a default to the request handler
in solrconfig.xml

The Lucene based Solr query syntax is slightly more strict.
A ':' in a field value must be escaped or the whole value must be quoted.

The Solr "Request Handler" framework has been updated in two key ways:
First, if a Request Handler is registered in solrconfig.xml with a name
starting with "/" then it can be accessed using path-based URL, instead of
using the legacy "/select?qt=name" URL structure.  Second, the Request
Handler framework has been extended making it possible to write Request
Handlers that process streams of data for doing updates, and there is a
new-style Request Handler for XML updates given the name of "/update" in
the example solrconfig.xml.  Existing installations without this "/update"
handler will continue to use the old update servlet and should see no
changes in behavior.  For new-style update handlers, errors are now
reflected in the HTTP status code, Content-type checking is more strict,
and the response format has changed and is controllable via the wt
parameter.



Detailed Change List
--------------------

New Features
 1. SOLR-82: Default field values can be specified in the schema.xml.
    (Ryan McKinley via hossman)

 2. SOLR-89: Two new TokenFilters with corresponding Factories...
    * TrimFilter - Trims leading and trailing whitespace from Tokens
    * PatternReplaceFilter - applies a Pattern to each token in the
      stream, replacing match occurances with a specified replacement.
    (hossman)

 3. SOLR-91: allow configuration of a limit of the number of searchers 
    that can be warming in the background.  This can be used to avoid
    out-of-memory errors, or contention caused by more and more searchers
    warming in the background.  An error is thrown if the limit specified
    by maxWarmingSearchers in solrconfig.xml is exceeded. (yonik)

 4. SOLR-106: New faceting parameters that allow specification of a
    minimum count for returned facets (facet.mincount), paging through facets
    (facet.offset, facet.limit), and explicit sorting (facet.sort).
    facet.zeros is now deprecated.  (yonik)

 5. SOLR-80: Negative queries are now allowed everywhere.  Negative queries
    are generated and cached as their positive counterpart, speeding
    generation and generally resulting in smaller sets to cache.
    Set intersections in SolrIndexSearcher are more efficient,
    starting with the smallest positive set, subtracting all negative
    sets, then intersecting with all other positive sets.  (yonik)

 6. SOLR-117: Limit a field faceting to constraints with a prefix specified
    by facet.prefix or f.<field>.facet.prefix. (yonik)

 7. SOLR-107: JAVA API: Change NamedList to use Java5 generics
    and implement Iterable<Map.Entry> (Ryan McKinley via yonik)

 8. SOLR-104: Support for "Update Plugins" -- RequestHandlers that want
    access to streams of data for doing updates.  ContentStreams can come
    from the raw POST body, multi-part form data, or remote URLs.
    Included in this change is a new SolrDispatchFilter that allows
    RequestHandlers registered with names that begin with a "/" to be
    accessed using a URL structure based on that name.
    (Ryan McKinley via hossman)

 9. SOLR-126: DirectUpdateHandler2 supports autocommitting after a specified time
    (in ms), using <autoCommit><maxTime>10000</maxTime></autoCommit>.
    (Ryan McKinley via klaas).

10. SOLR-116: IndexInfoRequestHandler added. (Erik Hatcher)

11. SOLR-79: Add system property ${<sys.prop>[:<default>]} substitution for
    configuration files loaded, including schema.xml and solrconfig.xml.
    (Erik Hatcher with inspiration from Andrew Saar)

12. SOLR-149: Changes to make Solr more easily embeddable, in addition
    to logging which request handler handled each request.
    (Ryan McKinley via yonik)

13. SOLR-86: Added standalone Java-based command-line updater.
    (Erik Hatcher via Bertrand Delecretaz)

14. SOLR-152: DisMaxRequestHandler now supports configurable alternate
    behavior when q is not specified.  A "q.alt" param can be specified
    using SolrQueryParser syntax as a mechanism for specifying what query
    the dismax handler should execute if the main user query (q) is blank.
    (Ryan McKinley via hossman)

15. SOLR-158: new "qs" (Query Slop) param for DisMaxRequestHandler
    allows for specifying the amount of default slop to use when parsing
    explicit phrase queries from the user.
    (Adam Hiatt via hossman)

16. SOLR-81: SpellCheckerRequestHandler that uses the SpellChecker from
    the Lucene contrib.
    (Otis Gospodnetic and Adam Hiatt)    

17. SOLR-182: allow lazy loading of request handlers on first request.
    (Ryan McKinley via yonik)

18. SOLR-81: More SpellCheckerRequestHandler enhancements, inlcluding
    support for relative or absolute directory path configurations, as
    well as RAM based directory. (hossman)   

19. SOLR-197: New parameters for input: stream.contentType for specifying
    or overriding the content type of input, and stream.file for reading
    local files. (Ryan McKinley via yonik)

20. SOLR-66: CSV data format for document additions and updates. (yonik)

21. SOLR-184: add echoHandler=true to responseHeader, support echoParams=all
    (Ryan McKinley via ehatcher)
    
22. SOLR-211: Added a regex PatternTokenizerFactory.  This extracts tokens 
    from the input string using a regex Pattern. (Ryan McKinley)
    
23. SOLR-162: Added a "Luke" request handler and other admin helpers.
    This exposes the system status through the standard requestHandler
    framework. (ryan)
    
24. SOLR-212: Added a DirectSolrConnection class.  This lets you access
    solr using the standard request/response formats, but does not require
    an HTTP connection.  It is designed for embedded applications. (ryan)    

25. SOLR-204: The request dispatcher (added in SOLR-104) can handle
    calls to /select.  This offers uniform error handling for /update and 
    /select.  To enable this behavior, you must add:
      <requestDispatcher handleSelect="true" > to your solrconfig.xml
    See the example solrconfig.xml for details.  (ryan)

26. SOLR-170: StandardRequestHandler now supports a "sort" parameter.
    Using the ';' syntax is still supported, but it is recommended to 
    transition to the new syntax. (ryan)

27. SOLR-181: The index schema now supports "required" fields.  Attempts
    to add a document without a required field will fail, returning a
    descriptive error message.  By default, the uniqueKey field is
    a required field.  This can be disabled by setting required=false
    in schema.xml.  (Greg Ludington via ryan)

28. SOLR-217: Fields configured in the schema to be neither indexed or
    stored will now be quietly ignored by Solr when Documents are added.
    The example schema has a comment explaining how this can be used to
    ignore any "unknown" fields.
    (Will Johnson via hossman)

29. SOLR-227: If schema.xml defines multiple fieldTypes, fields, or 
    dynamicFields with the same name, a severe error will be logged rather 
    then quietly continuing. Depending on the <abortOnConfigurationError> 
    settings, this may halt the server.  Likewise, if solrconfig.xml 
    defines multiple RequestHandlers with the same name it will also add
    an error.  (ryan)

30. SOLR-226: Added support for dynamic field as the destination of a 
    copyField using glob (*) replacement. (ryan)
    
31. SOLR-224: Adding a PhoneticFilterFactory that uses apache commons codec
    language encoders to build phonetically similar tokens.  This currently
    supports: DoubleMetaphone, Metaphone, Soundex, and RefinedSoundex (ryan)

32. SOLR-199: new n-gram tokenizers available via NGramTokenizerFactory 
    and EdgeNGramTokenizerFactory. (Adam Hiatt via yonik)

33. SOLR-234: TrimFilter can update the Token's startOffset and endOffset 
    if updateOffsets="true".  By default the Token offsets are unchanged.
    (ryan)

34. SOLR-208: new example_rss.xsl and example_atom.xsl to provide more
    examples for people about the Solr XML response format and how they
    can transform it to suit different needs.
    (Brian Whitman via hossman)

35. SOLR-249: Deprecated SolrException( int, ... ) constructors in favor 
    of constructors that takes an ErrorCode enum.  This will ensure that
    all SolrExceptions use a valid HTTP status code. (ryan)
    
36. SOLR-386: Abstracted SolrHighlighter and moved existing implementation
    to DefaultSolrHighlighter.  Adjusted SolrCore and solrconfig.xml so 
    that highlighter is configurable via a class attribute.  Allows users 
    to use their own highlighter implementation. (Tricia Williams via klaas) 
        
Changes in runtime behavior
 1. Highlighting using DisMax will only pick up terms from the main 
    user query, not boost or filter queries (klaas).

 2. SOLR-125: Change default of json.nl to flat, change so that
    json.nl only affects items where order matters (facet constraint
    listings).  Fix JSON output bug for null values.  Internal JAVA API:
    change most uses of NamedList to SimpleOrderedMap. (yonik)

 3. A new method "getSolrQueryParser" has been added to the IndexSchema
    class for retrieving a new SolrQueryParser instance with all options
    specified in the schema.xml's <solrQueryParser> block set.  The
    documentation for the SolrQueryParser constructor and it's use of
    IndexSchema have also been clarified.
    (Erik Hatcher and hossman)

 4. DisMaxRequestHandler's bq, bf, qf, and pf parameters can now accept
    multiple values (klaas).

 5. Query are re-written before highlighting is performed.  This enables
    proper highlighting of prefix and wildcard queries (klaas).

 6. A meaningful exception is raised when attempting to add a doc missing 
    a unique id if it is declared in the schema and allowDups=false.
    (ryan via klaas)

 7. SOLR-183: Exceptions with error code 400 are raised when
    numeric argument parsing fails.  RequiredSolrParams class added
    to facilitate checking for parameters that must be present.
    (Ryan McKinley, J.J. Larrea via yonik)

 8. SOLR-179: By default, solr will abort after any severe initalization
    errors.  This behavior can be disabled by setting:
    <abortOnConfigurationError>false</abortOnConfigurationError>
    in solrconfig.xml (ryan)

 9. The example solrconfig.xml maps /update to XmlUpdateRequestHandler using 
    the new request dispatcher (SOLR-104).  This requires posted content to 
    have a valid contentType: curl -H 'Content-type:text/xml; charset=utf-8' 
    The response format matches that of /select and returns standard error 
    codes.  To enable solr1.1 style /update, do not map "/update" to any 
    handler in solrconfig.xml (ryan)

10. SOLR-231: If a charset is not specified in the contentType, 
    ContentStream.getReader() will use UTF-8 encoding.  (ryan)

11. SOLR-230: More options for post.jar to support stdin, xml on the
    commandline, and defering commits.  Tutorial modified to take
    advantage of these options so there is no need for curl.
    (hossman)

12. SOLR-128: Upgraded Jetty to the latest stable release 6.1.3 (ryan)
    
Optimizations 
 1. SOLR-114: HashDocSet specific implementations of union() and andNot()
    for a 20x performance improvement for those set operations, and a new
    hash algorithm speeds up exists() by 10% and intersectionSize() by 8%.
    (yonik)
   
 2. SOLR-115: Solr now uses BooleanQuery.clauses() instead of
    BooleanQuery.getClauses() in any situation where there is no risk of
    modifying the original query.
    (hossman)

 3. SOLR-221: Speed up sorted faceting on multivalued fields by ~60%
    when the base set consists of a relatively large portion of the
    index. (yonik)

 4. SOLR-221: Added a facet.enum.cache.minDf parameter which avoids
    using the filterCache for terms that match few documents, trading
    decreased memory usage for increased query time. (yonik)

Bug Fixes
 1. SOLR-87: Parsing of synonym files did not correctly handle escaped
    whitespace such as \r\n\t\b\f. (yonik)

 2. SOLR-92: DOMUtils.getText (used when parsing config files) did not 
    work properly with many DOM implementations when dealing with 
    "Attributes". (Ryan McKinley via hossman)

 3. SOLR-9,SOLR-99: Tighten up sort specification error checking, throw
    exceptions for missing sort specifications or a sort on a non-indexed
    field. (Ryan McKinley via yonik)
    
 4. SOLR-145: Fix for bug introduced in SOLR-104 where some Exceptions
    were being ignored by all "out of the box" RequestHandlers. (hossman)
      
 5. SOLR-166: JNDI solr.home code refactoring.  SOLR-104 moved
    some JNDI related code to the init method of a Servlet Filter -
    according to the Servlet Spec, all Filter's should be initialized
    prior to initializing any Servlets, but this is not the case in at
    least one Servlet Container (Resin).  This "bug fix" refactors
    this JNDI code so that it should be executed the first time any
    attempt is made to use the solr.home dir.
    (Ryan McKinley via hossman)

 6. SOLR-173: Bug fix to SolrDispatchFilter to reduce "too many open
    files" problem was that SolrDispatchFilter was not closing requests
    when finished.  Also modified ResponseWriters to only fetch a Searcher
    reference if necessary for writing out DocLists.
    (Ryan McKinley via hossman)

 7. SOLR-168: Fix display positioning of multiple tokens at the same
    position in analysis.jsp (yonik)

 8. SOLR-167: The SynonymFilter sometimes generated incorrect offsets when
    multi token synonyms were mached in the source text. (yonik) 

 9. SOLR-188: bin scripts do not support non-default webapp names.  Added "-U"
    option to specify a full path to the update url, overriding the
    "-h" (hostname), "-p" (port) and "-w" (webapp name) parameters.
    (Jeff Rodenburg via billa)

10. SOLR-198: RunExecutableListener always waited for the process to
    finish, even when wait="false" was set. (Koji Sekiguchi via yonik)

11. SOLR-207: Changed distribution scripts to remove recursive find
    and avoid use of "find -maxdepth" on platforms where it is not
    supported. (yonik)

12. SOLR-222: Changing writeLockTimeout in solrconfig.xml did not
    change the effective timeout. (Koji Sekiguchi via yonik)

13. Changed the SOLR-104 RequestDispatcher so that /select?qt=xxx can not 
    access handlers that start with "/".  This makes path based authentication
    possible for path based request handlers.  (ryan)

14. SOLR-214: Some servlet containers (including Tomcat and Resin) do not
    obey the specified charset.  Rather then letting the the container handle 
    it solr now uses the charset from the header contentType to decode posted
    content.  Using the contentType: "text/xml; charset=utf-8" will force
    utf-8 encoding.  If you do not specify a contentType, it will use the 
    platform default.  (Koji Sekiguchi via ryan)

15. SOLR-241: Undefined system properties used in configuration files now
    cause a clear message to be logged rather than an obscure exception thrown.
    (Koji Sekiguchi via ehatcher) 

Other Changes
 1. Updated to Lucene 2.1

 2. Updated to Lucene 2007-05-20_00-04-53

================== Release 1.1.0, 20061222 ==================

Status
------
This is the first release since Solr joined the Incubator, and brings many
new features and performance optimizations including highlighting,
faceted browsing, and JSON/Python/Ruby response formats.


Upgrading from previous Solr versions
-------------------------------------
Older Apache Solr installations can be upgraded by replacing
the relevant war file with the new version.  No changes to configuration
files are needed and the index format has not changed.

The default version of the Solr XML response syntax has been changed to 2.2.
Behavior can be preserved for those clients not explicitly specifying a 
version by adding a default to the request handler in solrconfig.xml

By default, Solr will no longer use a searcher that has not fully warmed,
and requests will block in the meantime.  To change back to the previous
behavior of using a cold searcher in the event there is no other
warm searcher, see the useColdSearcher config item in solrconfig.xml

The XML response format when adding multiple documents to the collection
in a single <add> command has changed to return a single <result>.


Detailed Change List
--------------------

New Features
 1. added support for setting Lucene's positionIncrementGap
 2. Admin: new statistics for SolrIndexSearcher
 3. Admin: caches now show config params on stats page
 3. max() function added to FunctionQuery suite
 4. postOptimize hook, mirroring the functionallity of the postCommit hook,
    but only called on an index optimize.
 5. Ability to HTTP POST query requests to /select in addition to HTTP-GET
 6. The default search field may now be overridden by requests to the
    standard request handler using the df query parameter. (Erik Hatcher)
 7. Added DisMaxRequestHandler and SolrPluginUtils. (Chris Hostetter)
 8. Support for customizing the QueryResponseWriter per request
    (Mike Baranczak / SOLR-16 / hossman)
 9. Added KeywordTokenizerFactory (hossman)
10. copyField accepts dynamicfield-like names as the source.
    (Darren Erik Vengroff via yonik, SOLR-21)
11. new DocSet.andNot(), DocSet.andNotSize() (yonik)
12. Ability to store term vectors for fields. (Mike Klaas via yonik, SOLR-23)
13. New abstract BufferedTokenStream for people who want to write
    Tokenizers or TokenFilters that require arbitrary buffering of the
    stream. (SOLR-11 / yonik, hossman)
14. New RemoveDuplicatesToken - useful in situations where
    synonyms, stemming, or word-deliminater-ing produce identical tokens at
    the same position. (SOLR-11 / yonik, hossman)
15. Added highlighting to SolrPluginUtils and implemented in StandardRequestHandler
    and DisMaxRequestHandler (SOLR-24 / Mike Klaas via hossman,yonik)
16. SnowballPorterFilterFactory language is configurable via the "language"
    attribute, with the default being "English".  (Bertrand Delacretaz via yonik, SOLR-27)
17. ISOLatin1AccentFilterFactory, instantiates ISOLatin1AccentFilter to remove accents.
    (Bertrand Delacretaz via yonik, SOLR-28)
18. JSON, Python, Ruby QueryResponseWriters: use wt="json", "python" or "ruby"
    (yonik, SOLR-31)
19. Make web admin pages return UTF-8, change Content-type declaration to include a
    space between the mime-type and charset (Philip Jacob, SOLR-35)
20. Made query parser default operator configurable via schema.xml:
         <solrQueryParser defaultOperator="AND|OR"/>
    The default operator remains "OR".
21. JAVA API: new version of SolrIndexSearcher.getDocListAndSet() which takes
    flags (Greg Ludington via yonik, SOLR-39)
22. A HyphenatedWordsFilter, a text analysis filter used during indexing to rejoin
    words that were hyphenated and split by a newline. (Boris Vitez via yonik, SOLR-41)
23. Added a CompressableField base class which allows fields of derived types to
    be compressed using the compress=true setting.  The field type also gains the
    ability to specify a size threshold at which field data is compressed.
    (klaas, SOLR-45)
24. Simple faceted search support for fields (enumerating terms)
    and arbitrary queries added to both StandardRequestHandler and
    DisMaxRequestHandler. (hossman, SOLR-44)
25. In addition to specifying default RequestHandler params in the
    solrconfig.xml, support has been added for configuring values to be
    appended to the multi-val request params, as well as for configuring
    invariant params that can not overridden in the query. (hossman, SOLR-46)
26. Default operator for query parsing can now be specified with q.op=AND|OR
    from the client request, overriding the schema value. (ehatcher)
27. New XSLTResponseWriter does server side XSLT processing of XML Response.
    In the process, an init(NamedList) method was added to QueryResponseWriter
    which works the same way as SolrRequestHandler.
    (Bertrand Delacretaz / SOLR-49 / hossman)
28. json.wrf parameter adds a wrapper-function around the JSON response,
    useful in AJAX with dynamic script tags for specifying a JavaScript
    callback function. (Bertrand Delacretaz via yonik, SOLR-56)
29. autoCommit can be specified every so many documents added (klaas, SOLR-65)
30. ${solr.home}/lib directory can now be used for specifying "plugin" jars
    (hossman, SOLR-68)
31. Support for "Date Math" relative "NOW" when specifying values of a
    DateField in a query -- or when adding a document.
    (hossman, SOLR-71)
32. useColdSearcher control in solrconfig.xml prevents the first searcher
    from being used before it's done warming.  This can help prevent
    thrashing on startup when multiple requests hit a cold searcher.
    The default is "false", preventing use before warm. (yonik, SOLR-77)
    
Changes in runtime behavior
 1. classes reorganized into different packages, package names changed to Apache
 2. force read of document stored fields in QuerySenderListener
 3. Solr now looks in ./solr/conf for config, ./solr/data for data
    configurable via solr.solr.home system property
 4. Highlighter params changed to be prefixed with "hl."; allow fragmentsize
    customization and per-field overrides on many options 
    (Andrew May via klaas, SOLR-37)
 5. Default param values for DisMaxRequestHandler should now be specified
    using a '<lst name="defaults">...</lst>' init param, for backwards
    compatability all init prams will be used as defaults if an init param
    with that name does not exist. (hossman, SOLR-43)
 6. The DisMaxRequestHandler now supports multiple occurances of the "fq"
    param. (hossman, SOLR-44)
 7. FunctionQuery.explain now uses ComplexExplanation to provide more
    accurate score explanations when composed in a BooleanQuery.
    (hossman, SOLR-25)
 8. Document update handling locking is much sparser, allowing performance gains
    through multiple threads.  Large commits also might be faster (klaas, SOLR-65)
 9. Lazy field loading can be enabled via a solrconfig directive.  This will be faster when
    not all stored fields are needed from a document (klaas, SOLR-52)   
10. Made admin JSPs return XML and transform them with new XSL stylesheets
    (Otis Gospodnetic, SOLR-58)
11. If the "echoParams=explicit" request parameter is set, request parameters are copied 
    to the output. In an XML output, they appear in new <lst name="params"> list inside 
    the new <lst name="responseHeader"> element, which replaces the old <responseHeader>. 
    Adding a version=2.1 parameter to the request produces the old format, for backwards 
    compatibility (bdelacretaz and yonik, SOLR-59).

Optimizations 
 1. getDocListAndSet can now generate both a DocList and a DocSet from a 
    single lucene query.
 2. BitDocSet.intersectionSize(HashDocSet) no longer generates an intermediate
    set
 3. OpenBitSet completed, replaces BitSet as the implementation for BitDocSet.
    Iteration is faster, and BitDocSet.intersectionSize(BitDocSet) and unionSize
    is between 3 and 4 times faster. (yonik, SOLR-15)
 4. much faster unionSize when one of the sets is a HashDocSet: O(smaller_set_size)
 5. Optimized getDocSet() for term queries resulting in a 36% speedup of facet.field
    queries where DocSets aren't cached (for example, if the number of terms in the field
    is larger than the filter cache.) (yonik)
 6. Optimized facet.field faceting by as much as 500 times when the field has
    a single token per document (not multiValued & not tokenized) by using the
    Lucene FieldCache entry for that field to tally term counts.  The first request
    utilizing the FieldCache will take longer than subsequent ones.

Bug Fixes
 1. Fixed delete-by-id for field types who's indexed form is different
    from the printable form (mainly sortable numeric types).
 2. Added escaping of attribute values in the XML response (Erik Hatcher)
 3. Added empty extractTerms() to FunctionQuery to enable use in
    a MultiSearcher (Yonik)
 4. WordDelimiterFilter sometimes lost token positionIncrement information
 5. Fix reverse sorting for fields were sortMissingFirst=true
    (Rob Staveley, yonik)
 6. Worked around a Jetty bug that caused invalid XML responses for fields
    containing non ASCII chars.  (Bertrand Delacretaz via yonik, SOLR-32)
 7. WordDelimiterFilter can throw exceptions if configured with both
    generate and catenate off.  (Mike Klaas via yonik, SOLR-34)
 8. Escape '>' in XML output (because ]]> is illegal in CharData) 
 9. field boosts weren't being applied and doc boosts were being applied to fields (klaas)
10. Multiple-doc update generates well-formed xml (klaas, SOLR-65)
11. Better parsing of pingQuery from solrconfig.xml (hossman, SOLR-70)
12. Fixed bug with "Distribution" page introduced when Versions were
    added to "Info" page (hossman)
13. Fixed HTML escaping issues with user input to analysis.jsp and action.jsp
    (hossman, SOLR-74)

Other Changes
 1. Upgrade to Lucene 2.0 nightly build 2006-06-22, lucene SVN revision 416224,
    http://svn.apache.org/viewvc/lucene/java/trunk/CHANGES.txt?view=markup&pathrev=416224
 2. Modified admin styles to improve display in Internet Explorer (Greg Ludington via billa, SOLR-6)
 3. Upgrade to Lucene 2.0 nightly build 2006-07-15, lucene SVN revision 422302,
 4. Included unique key field name/value (if available) in log message of add (billa, SOLR-18)
 5. Updated to Lucene 2.0 nightly build 2006-09-07, SVN revision 462111
 6. Added javascript to catch empty query in admin query forms (Tomislav Nakic-Alfirevic via billa, SOLR-48
 7. blackslash escape * in ssh command used in snappuller for zsh compatibility, SOLR-63
 8. check solr return code in admin scripts, SOLR-62
 9. Updated to Lucene 2.0 nightly build 2006-11-15, SVN revision 475069
10. Removed src/apps containing the legacy "SolrTest" app (hossman, SOLR-3)
11. Simplified index.jsp and form.jsp, primarily by removing/hiding XML
    specific params, and adding an option to pick the output type. (hossman)
12. Added new numeric build property "specversion" to allow clean
    MANIFEST.MF files (hossman)
13. Added Solr/Lucene versions to "Info" page (hossman)
14. Explicitly set mime-type of .xsl files in web.xml to
    application/xslt+xml (hossman)
15. Config parsing should now work useing DOM Level 2 parsers -- Solr
    previously relied on getTextContent which is a DOM Level 3 addition
    (Alexander Saar via hossman, SOLR-78)

2006/01/17 Solr open sourced, moves to Apache Incubator
