Search in sources :

Example 1 with Like

use of co.elastic.clients.elasticsearch._types.query_dsl.Like in project syncope by apache.

the class ElasticsearchAnySearchDAO method fillAttrQuery.

protected Query fillAttrQuery(final PlainSchema schema, final PlainAttrValue attrValue, final AttrCond cond) {
    Object value = schema.getType() == AttrSchemaType.Date && attrValue.getDateValue() != null ? attrValue.getDateValue().getTime() : attrValue.getValue();
    Query query = null;
    switch(cond.getType()) {
        case ISNOTNULL:
            query = new Query.Builder().exists(QueryBuilders.exists().field(schema.getKey()).build()).build();
            break;
        case ISNULL:
            query = new Query.Builder().bool(QueryBuilders.bool().mustNot(new Query.Builder().exists(QueryBuilders.exists().field(schema.getKey()).build()).build()).build()).build();
            break;
        case ILIKE:
            StringBuilder output = new StringBuilder();
            for (char c : cond.getExpression().toLowerCase().toCharArray()) {
                if (c == '%') {
                    output.append(".*");
                } else if (Character.isLetter(c)) {
                    output.append('[').append(c).append(Character.toUpperCase(c)).append(']');
                } else {
                    output.append(escapeForLikeRegex(c));
                }
            }
            query = new Query.Builder().regexp(QueryBuilders.regexp().field(schema.getKey()).value(output.toString()).build()).build();
            break;
        case LIKE:
            query = new Query.Builder().wildcard(QueryBuilders.wildcard().field(schema.getKey()).value(cond.getExpression().replace('%', '*')).build()).build();
            break;
        case IEQ:
            query = new Query.Builder().match(QueryBuilders.match().field(schema.getKey()).query(FieldValue.of(cond.getExpression().toLowerCase())).build()).build();
            break;
        case EQ:
            FieldValue fieldValue;
            if (value instanceof Double) {
                fieldValue = FieldValue.of((Double) value);
            } else if (value instanceof Long) {
                fieldValue = FieldValue.of((Long) value);
            } else if (value instanceof Boolean) {
                fieldValue = FieldValue.of((Boolean) value);
            } else {
                fieldValue = FieldValue.of(value.toString());
            }
            query = new Query.Builder().term(QueryBuilders.term().field(schema.getKey()).value(fieldValue).build()).build();
            break;
        case GE:
            query = new Query.Builder().range(QueryBuilders.range().field(schema.getKey()).gte(JsonData.of(value)).build()).build();
            break;
        case GT:
            query = new Query.Builder().range(QueryBuilders.range().field(schema.getKey()).gt(JsonData.of(value)).build()).build();
            break;
        case LE:
            query = new Query.Builder().range(QueryBuilders.range().field(schema.getKey()).lte(JsonData.of(value)).build()).build();
            break;
        case LT:
            query = new Query.Builder().range(QueryBuilders.range().field(schema.getKey()).lt(JsonData.of(value)).build()).build();
            break;
        default:
    }
    return query;
}
Also used : Query(co.elastic.clients.elasticsearch._types.query_dsl.Query) FieldValue(co.elastic.clients.elasticsearch._types.FieldValue)

Example 2 with Like

use of co.elastic.clients.elasticsearch._types.query_dsl.Like in project para-search-elasticsearch by Erudika.

the class ES method findSimilarInternal.

public static <P extends ParaObject> List<P> findSimilarInternal(String appid, String type, String filterKey, String[] fields, String liketext, Pager... pager) {
    if (StringUtils.isBlank(liketext)) {
        return Collections.emptyList();
    }
    QueryVariant qb;
    String matchPercent = "70%";
    if (fields == null || fields.length == 0) {
        qb = QueryBuilders.moreLikeThis().like(l -> l.text(liketext)).minDocFreq(1).minTermFreq(1).minimumShouldMatch(matchPercent).build();
    } else {
        boolean containsNestedProps = Arrays.stream(fields).anyMatch((f) -> StringUtils.startsWith(f, PROPS_PREFIX));
        if (nestedMode() && containsNestedProps) {
            BoolQuery.Builder bqb = QueryBuilders.bool();
            for (String field : fields) {
                QueryVariant kQuery = QueryBuilders.match().field(PROPS_PREFIX + "k").query(v -> v.stringValue(getNestedKey(field))).build();
                QueryVariant vQuery = QueryBuilders.moreLikeThis().fields(PROPS_PREFIX + "v").like(Like.of(l -> l.text(liketext))).minDocFreq(1).minTermFreq(1).minimumShouldMatch(matchPercent).build();
                QueryVariant nested = (QueryVariant) nestedPropsQuery(QueryBuilders.bool().must(kQuery._toQuery(), vQuery._toQuery()).build()).build();
                bqb.should(nested._toQuery());
            }
            qb = bqb.build();
        } else {
            qb = QueryBuilders.moreLikeThis().fields(Arrays.asList(fields)).like(l -> l.text(liketext)).minDocFreq(1).minTermFreq(1).minimumShouldMatch(matchPercent).build();
        }
    }
    if (!StringUtils.isBlank(filterKey)) {
        qb = QueryBuilders.bool().mustNot(QueryBuilders.term().field(Config._ID).value(v -> v.stringValue(filterKey)).build()._toQuery()).filter(qb._toQuery()).build();
    }
    return searchQuery(appid, searchQueryRaw(appid, type, qb, pager));
}
Also used : Arrays(java.util.Arrays) BulkOperation(co.elastic.clients.elasticsearch.core.bulk.BulkOperation) Like(co.elastic.clients.elasticsearch._types.query_dsl.Like) ESUtils.getNestedKey(com.erudika.para.server.search.es.ESUtils.getNestedKey) LoggerFactory(org.slf4j.LoggerFactory) TotalHitsRelation(co.elastic.clients.elasticsearch.core.search.TotalHitsRelation) ESUtils.getRESTClient(com.erudika.para.server.search.es.ESUtils.getRESTClient) StringUtils(org.apache.commons.lang3.StringUtils) ESUtils.qs(com.erudika.para.server.search.es.ESUtils.qs) ESUtils.convertQueryStringToNestedQuery(com.erudika.para.server.search.es.ESUtils.convertQueryStringToNestedQuery) PROPS_PREFIX(com.erudika.para.server.search.es.ESUtils.PROPS_PREFIX) Map(java.util.Map) FieldValue(co.elastic.clients.elasticsearch._types.FieldValue) ESUtils.getTermsQuery(com.erudika.para.server.search.es.ESUtils.getTermsQuery) Config(com.erudika.para.core.utils.Config) ParaObject(com.erudika.para.core.ParaObject) GetResponse(co.elastic.clients.elasticsearch.core.GetResponse) ESUtils.nestedMode(com.erudika.para.server.search.es.ESUtils.nestedMode) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) List(java.util.List) Tag(com.erudika.para.core.Tag) ESUtils.executeRequests(com.erudika.para.server.search.es.ESUtils.executeRequests) Optional(java.util.Optional) Para(com.erudika.para.core.utils.Para) QueryBuilders(co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders) App(com.erudika.para.core.App) SearchRequest(co.elastic.clients.elasticsearch.core.SearchRequest) SearchResponse(co.elastic.clients.elasticsearch.core.SearchResponse) SearchType(co.elastic.clients.elasticsearch._types.SearchType) ESUtils.getPager(com.erudika.para.server.search.es.ESUtils.getPager) HashMap(java.util.HashMap) ChildScoreMode(co.elastic.clients.elasticsearch._types.query_dsl.ChildScoreMode) Pager(com.erudika.para.core.utils.Pager) ArrayList(java.util.ArrayList) ESUtils.keyValueBoolQuery(com.erudika.para.server.search.es.ESUtils.keyValueBoolQuery) TotalHits(co.elastic.clients.elasticsearch.core.search.TotalHits) DAO(com.erudika.para.core.persistence.DAO) LinkedList(java.util.LinkedList) BoolQuery(co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery) ESUtils.nestedPropsQuery(com.erudika.para.server.search.es.ESUtils.nestedPropsQuery) Logger(org.slf4j.Logger) SortOrder(co.elastic.clients.elasticsearch._types.SortOrder) Address(com.erudika.para.core.Address) ESUtils.getValueFieldName(com.erudika.para.server.search.es.ESUtils.getValueFieldName) ESUtils.getIndexName(com.erudika.para.server.search.es.ESUtils.getIndexName) Utils(com.erudika.para.core.utils.Utils) TimeUnit(java.util.concurrent.TimeUnit) Hit(co.elastic.clients.elasticsearch.core.search.Hit) Query(co.elastic.clients.elasticsearch._types.query_dsl.Query) QueryVariant(co.elastic.clients.elasticsearch._types.query_dsl.QueryVariant) SortOptions(co.elastic.clients.elasticsearch._types.SortOptions) Collections(java.util.Collections) QueryVariant(co.elastic.clients.elasticsearch._types.query_dsl.QueryVariant) ESUtils.keyValueBoolQuery(com.erudika.para.server.search.es.ESUtils.keyValueBoolQuery) BoolQuery(co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery)

Aggregations

FieldValue (co.elastic.clients.elasticsearch._types.FieldValue)2 Query (co.elastic.clients.elasticsearch._types.query_dsl.Query)2 SearchType (co.elastic.clients.elasticsearch._types.SearchType)1 SortOptions (co.elastic.clients.elasticsearch._types.SortOptions)1 SortOrder (co.elastic.clients.elasticsearch._types.SortOrder)1 BoolQuery (co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery)1 ChildScoreMode (co.elastic.clients.elasticsearch._types.query_dsl.ChildScoreMode)1 Like (co.elastic.clients.elasticsearch._types.query_dsl.Like)1 QueryBuilders (co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders)1 QueryVariant (co.elastic.clients.elasticsearch._types.query_dsl.QueryVariant)1 GetResponse (co.elastic.clients.elasticsearch.core.GetResponse)1 SearchRequest (co.elastic.clients.elasticsearch.core.SearchRequest)1 SearchResponse (co.elastic.clients.elasticsearch.core.SearchResponse)1 BulkOperation (co.elastic.clients.elasticsearch.core.bulk.BulkOperation)1 Hit (co.elastic.clients.elasticsearch.core.search.Hit)1 TotalHits (co.elastic.clients.elasticsearch.core.search.TotalHits)1 TotalHitsRelation (co.elastic.clients.elasticsearch.core.search.TotalHitsRelation)1 Address (com.erudika.para.core.Address)1 App (com.erudika.para.core.App)1 ParaObject (com.erudika.para.core.ParaObject)1