Я пытаюсь реализовать функцию полнотекстового поиска с помощью поиска в режиме гибернации. Нам нужно искать имена, адреса и т. Д.
Пользователь может выполнять поиск по имени «Джон», «Джон Мэрфи», «Марк», «Марк Л Томас» и по адресам, таким как «20601 бульвар», «Первый этаж» и т. Д.
Хотя текущая логика работает для нескольких слов с более чем 2-мя символами, например «Джон» доступен для поиска, но не «Марк», если я говорю «Ма», то у меня есть результаты, но если я пишу «Мар» или «Марк», это не так дает любую запись. Я также могу искать с городом как Колумбия.
Также не работает поиск по нескольким словам.
Когда я не использую какой-либо анализатор (как в приведенном ниже коде), действительны вышеприведенные утверждения, если я использую edgengram, текст, стандартные анализаторы, тогда у меня разные результаты. Но ни один из анализаторов не работает.
Ниже приведен полный код:
Структура индекса, из которой я пытаюсь получить данные:
> {
> "_index" : "client_master_index_0300",
> "_type" : "com.csc.pt.svc.data.to.Basclt0300TO",
> "_id" : "518,1",
> "_score" : 4.0615783,
> "_source" : {
> "id" : "518,1",
> "cltseqnum" : 518,
> "addrseqnum" : "1",
> "addrln1" : "Dba",
> "addrln2" : "Betsy Evans",
> "city" : "SDA",
> "state" : "SC",
> "zipcode" : "89756-4531",
> "country" : "USA",
> "basclt0100to" : {
> "cltseqnum" : 518,
> "clientname" : "Betsy Evans",
> "longname" : "Betsy Evans",
> "id" : "518"
> },
> "basclt0900to" : {
> "cltseqnum" : 518,
> "id" : "518"
> }
> }
> }
Определение индекса для того же индекса:
{
> "client_master_index_0300" : {
> "aliases" : { },
> "mappings" : {
> "com.csc.pt.svc.data.to.Basclt0300TO" : {
> "dynamic" : "strict",
> "properties" : {
> "addrln1" : {
> "type" : "text",
> "store" : true
> },
> "addrln2" : {
> "type" : "text",
> "store" : true
> },
> "addrln3" : {
> "type" : "text",
> "store" : true
> },
> "addrseqnum" : {
> "type" : "text",
> "store" : true
> },
> "basclt0100to" : {
> "properties" : {
> "clientname" : {
> "type" : "text",
> "store" : true
> },
> "cltseqnum" : {
> "type" : "long",
> "store" : true
> },
> "firstname" : {
> "type" : "text",
> "store" : true
> },
> "id" : {
> "type" : "keyword",
> "store" : true,
> "norms" : true
> },
> "longname" : {
> "type" : "text",
> "store" : true
> },
> "midname" : {
> "type" : "text",
> "store" : true
> }
> }
> },
> "basclt0900to" : {
> "properties" : {
> "cltseqnum" : {
> "type" : "long",
> "store" : true
> },
> "email1" : {
> "type" : "text",
> "store" : true
> },
> "id" : {
> "type" : "keyword",
> "store" : true,
> "norms" : true
> }
> }
> },
> "city" : {
> "type" : "text",
> "store" : true
> },
> "cltseqnum" : {
> "type" : "long",
> "store" : true
> },
> "country" : {
> "type" : "text",
> "store" : true
> },
> "id" : {
> "type" : "keyword",
> "store" : true
> },
> "state" : {
> "type" : "text",
> "store" : true
> },
> "zipcode" : {
> "type" : "text",
> "store" : true
> }
> }
> }
> },
> "settings" : {
> "index" : {
> "creation_date" : "1535607176216",
> "number_of_shards" : "5",
> "number_of_replicas" : "1",
> "uuid" : "x4R71LNCTBSyO9Taf8siOw",
> "version" : {
> "created" : "6030299"
> },
> "provided_name" : "client_master_index_0300"
> }
> }
> }
> }
Java-объекты, содержащие поля:
@Field(name = "longname", index = Index.YES, store = Store.YES,
analyze = Analyze.YES)
private String longname = "";
@Field(name = "firstname", index = Index.YES, store = Store.YES,
analyze = Analyze.YES)
private String firstname = "";
Далее, сейчас я использую контекстный запрос с подстановочными знаками:
public synchronized void searchClienData() {
String lowerCasedSearchTerm = this.data.getSearchText().toLowerCase();
SearchFactory searchFactory = fullTextSession.getSearchFactory();
QueryBuilder buildQuery = searchFactory.buildQueryBuilder().forEntity(Basclt0300TO.class).get();
String[] projections = {"basclt0100to.longname", "basclt0100to.cltseqnum", "addrln1", "addrln2",
"city","state","zipcode", "country","basclt0900to.email1" };
Query query = queryBuilder.keyword()
.onField("basclt0100to.longname").andField("addrln1").andField("addrln2")
.andField("city").andField("state").andField("country").matching(lowerCasedSearchTerm)
.createQuery();
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, Basclt0300TO.class);
fullTextQuery.setMaxResults(this.data.getPageSize()).setFirstResult(this.data.getPageSize());
List<String> projectedFields = new ArrayList<String>();
for (String fieldName : projections)
projectedFields.add(fieldName);
@SuppressWarnings("unchecked")
List<Cltj001ElasticSearchResponseTO> results = fullTextQuery.
setProjection(projectedFields.toArray(new String[projectedFields.size()]))
.setResultTransformer( new BasicTransformerAdapter() {
private static final long serialVersionUID = 1L;
@Override
public Cltj001ElasticSearchResponseTO transformTuple(Object[] tuple, String[] aliases) {
return new Cltj001ElasticSearchResponseTO((String) tuple[0], (long) tuple[1],
(String) tuple[2], (String) tuple[3], (String) tuple[4],
(String) tuple[5],(String) tuple[6], (String) tuple[7], (String) tuple[8]);
}
})
.getResultList();
resultsClt0300MasterIndexList = results;
}