запрос гибернации не ищет более 2 символов для некоторых строк и не работает при поиске нескольких слов - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь реализовать функцию полнотекстового поиска с помощью поиска в режиме гибернации. Нам нужно искать имена, адреса и т. Д. Пользователь может выполнять поиск по имени «Джон», «Джон Мэрфи», «Марк», «Марк Л Томас» и по адресам, таким как «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;

}

1 Ответ

0 голосов
/ 29 августа 2018

Во-первых, вам необходимо назначить определения анализатора вашим полям. Недостаточно просто определить анализаторы.

@Field(name = "longname", index = Index.YES, store = Store.YES,
        analyze = Analyze.YES, analyzer = @Analyzer(definition = "theNameOfSomeAnalyzerDefinition"))
private String longname = "";

@Field(name = "firstname", index = Index.YES, store = Store.YES,
    analyze = Analyze.YES, analyzer = @Analyzer(definition = "theNameOfSomeAnalyzerDefinition"))
private String firstname = "";

Затем вам нужно выбрать стратегию и придерживаться ее:

  • либо вы используете подстановочные запросы, которые просты в использовании и не требуют фильтров маркеров EdgeNGram, но, как правило, вызывают проблемы из-за того, что условия запроса не анализируются
  • или вы применяете фильтры токенов EdgeNGram к своим полям и во время запроса:
    • использовать запрос по ключевому слову без подстановочного знака
    • и переопределяют анализаторы , чтобы использовать разные, которые должны иметь то же определение, что и анализаторы, назначенные вашим полям, за исключением того, что они не должны использовать токен-фильтр EdgeNGram.

Но не смешивайте два подхода. Никогда. Это просто не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...