Использование аннотаций для спящего режима (в основном только @Field(index = Index.TOKENIZED)
) Я проиндексировал ряд полей, связанных с сохранившимся классом, называемым Compound. Я установил текстовый поиск по всем индексированным полям, используя MultiFieldQueryParser
, который до сих пор работал нормально.Согласование подстановочных знаков Lucene на химических обозначениях (?)
Среди полей, индексированных и с возможностью поиска является поле, называемое compoundName, со значениями выборки:
3-Hydroxyflavone
6,4'-Dihydroxyflavone
Когда я искать любое из этих значений в полном родственном соединении экземпляры возвращаются. Однако проблемы возникают, когда я использую частичное имя и ввести символы:
- поиски
3-Hydroxyflav*
все еще дает правильный удар, но - ищет
6,4'-Dihydroxyflav*
не может найти что-нибудь.
Теперь, когда я совсем новичок в Lucene/Hibernate-поиска, я не совсем уверен, где смотреть на данный момент .. Я думаю, что это, возможно, что-то делать с '
настоящее во втором запросе , но я не знаю, как это сделать. Должен ли я смотреть в токенизаторы/анализы/QueryParsers или что-то еще?
Или может кто-нибудь сказать мне, как я могу получить второй поиск подстановочных знаков, желательно, не нарушая поведение MultiField-поиска?
Я использую Hibernate-Search 3.1.0.GA & Lucene-core 2.9.3.
Некоторые соответствующие кодовые биты, чтобы проиллюстрировать мой текущий подход:
Соответствующие части индексированного класса соединения:
@Entity
@Indexed
@Data
@EqualsAndHashCode(callSuper = false, of = { "inchikey" })
public class Compound extends DomainObject {
@NaturalId
@NotEmpty
@Length(max = 30)
@Field(index = Index.TOKENIZED)
private String inchikey;
@ManyToOne
@IndexedEmbedded
private ChemicalClass chemicalClass;
@Field(index = Index.TOKENIZED)
private String commonName;
...
}
Как я в настоящее время поиска над индексированных полей:
String[] searchfields = Compound.getSearchfields();
MultiFieldQueryParser parser =
new MultiFieldQueryParser(Version.LUCENE_29, searchfields, new StandardAnalyzer(Version.LUCENE_29));
FullTextSession fullTextSession = Search.getFullTextSession(getSession());
FullTextQuery fullTextQuery =
fullTextSession.createFullTextQuery(parser.parse("searchterms"), Compound.class);
List<Compound> hits = fullTextQuery.list();
FYI, я быстро проверил, как StandardAnalyzer размечает свои примеры. «3-Гидроксифлавон», похоже, подпадает под упомянутое выше правило продукта. Он становится единственным символом «3-гидроксифлавон». «6,4'-Дигидроксифлавон», с другой стороны, превращается в два токена «6,4» и «дигидроксифлавон». – Hardy
Ничего себе, спасибо! Я просто пытался использовать Luke здесь, чтобы проверить то же самое. Gues это означает, что мне нужно использовать альтернативный анализатор? (Я пытался установить поле UN_TOKENIZED, но это даже ломает первый пример поиска.) – Tim
Кажется, StandardTokenizer разбивает слова на апострофы .. Это, по крайней мере, указывает на проблему, но мне потребуется некоторое время, чтобы исправить это .. :) Спасибо за помощь! – Tim