Использование поисковых аннотаций Hibernate (в основном просто @Field(index = Index.TOKENIZED)
) Я проиндексировал ряд полей, связанных с моим постоянным классом под названием Compound. Я настроил текстовый поиск по всем индексированным полям, используя MultiFieldQueryParser
, который до сих пор работал нормально.
Среди индексируемых и доступных для поиска полей есть поле под названием componentName с примерами значений:
3-Hydroxyflavone
6,4'-Dihydroxyflavone
Когда я ищу одно из этих значений в полном объеме, возвращаются связанные экземпляры составных данных. Однако возникают проблемы, когда я использую частичное имя и вводить символы подстановки:
- поиск
3-Hydroxyflav*
все еще дает правильный удар, но
- при поиске
6,4'-Dihydroxyflav*
ничего не находит.
Теперь, когда я довольно новичок в Lucene / Hibernate-search, я не совсем уверен, где искать этот момент ... Я думаю, что это может иметь какое-то отношение к '
, присутствующему во втором запросе, но я не знаю, как поступить .. Стоит ли искать токенизаторы / анализаторы / 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();