==
сравнивает ссылки на объекты.
.equals()
сравнивает значения String.
Иногда ==
дает иллюзии сравнения значений String, как в следующих случаях:
String a="Test";
String b="Test";
if(a==b) ===> true
Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:
(a == b) ===> true
String Pool
b -----------------> "test" <-----------------a
Однако ==
не выполняется в следующем случае:
String a="test";
String b=new String("test");
if (a==b) ===> false
В этом случае для new String("test")
оператор new String будет создан в куче, и эта ссылка будет указана на b
, поэтому b
будет дана ссылка на кучу, а не на String pool.
Теперь a
указывает на String в пуле String, а b
указывает на String в куче. Из-за этого мы получаем:
, если (a == b) ===> false.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Пока .equals()
всегда сравнивает значение String, поэтому дает true в обоих случаях:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Таким образом, использование .equals()
всегда лучше.
Apache Lucene является де-факто выбором для полнотекстового индексирования на Java. Похоже, что Compass Core содержит "Реализацию Lucene Directory для хранения индекса в базе данных (с использованием Jdbc). Она отделена от базы кода Compass и может быть использована с чистыми Lucene приложениями" плюс тонны других вещей. Можно попробовать отделить только компонент Lucence, тем самым удалив несколько libs и сделав его более легким. Либо это, либо вообще отказаться от Компаса и использовать чистый Lucene без прикрас.
.Честно говоря, я не знаю, будет ли Люсин легче Компаса в плане индексации (с чего бы это, разве Компас не использует для этого Люсин?).
В любом случае, потому что вы просили альтернативы, есть GAELucene . Я цитирую его объявление ниже:
Просвещенное обсуждением "Могу я запустить Люсин в Google app engine?", Я внедрил хранилище данных Google на базе Компонент люцена, галюцин, который может поможет вам запустить поисковые приложения на движок приложений Google.
Главная клавиша GAELucene включает:
- GAED - каталог только для чтения, основанный на хранилище данных Google.
- GAEFile - обозначает индексный файл, содержание байта файла будет следующим разделенный на мульти GAEFileContent.
- GAEFileContent - обозначает сегмент индексного файла.
- GAECategory - идентификатор различных индексов.
- GAEIndexInput - реализация IndexInput резидентной памяти типа RAMInputStream.
- GAEIndexReader - обёртка для IndexReader? которая кэшируется в GAEIndexReaderPool
- GAEIndexReaderPool - пул для GAEIndexReader
Следующий фрагмент кода демонстрирует применение GAELucene do search:
Query requestObject = parserQuery(request); GAEIndexReaderPool readerPool = GAEIndexReaderPool.getInstance(); GAEIndexReader indexReader = readerPool.borrowReader(INDEX_CATEGORY_DEMO); IndexSearcher searchcher = newIndexSearcher(indexReader); Hitsits = searchcher.search(queryObject); readerPool.returnReader(indexReader);
Я горячо рекомендую прочитать всю дискуссию о nabble, очень содержательную.
На всякий случай, касательно Compass, Шей Бэнон написал запись в блоге, в которой подробно рассказал, как использовать Compass в App Engine здесь: http://www.kimchy.org/searchable-google-appengine-with-compass/
Для Google App Engine единственная библиотека индексирования, которую я видел, это appengine-search, с описанием ее использования на этой странице . Однако я не пробовал его использовать.
Я использовал Lucene (на котором основан Компас) и обнаружил, что он отлично работает при сравнительно низких затратах. Индексация - это задача, которую вы можете запланировать в моменты работы вашего приложения.
Некоторые альтернативные проекты индексации упоминаются в этом SO потоке, в том числе Xapian и minion. Но я не проверил ни то, ни другое, так как Люсин сделала все, что мне было нужно, чтобы это было очень хорошо.
.