2017-10-03 5 views
1

내 루프백 서버에서 데이터를 쿼리하려면 admin-on-rest와 함께 전체 텍스트 필터를 사용하고 싶습니다. 나는 문서 (AOR-doc)에서 예를 구현하기 위해 노력했다,하지만 난 불행히도 단 하나의 필드 쿼리 처리했다 : 나는 여러 분야에 걸쳐 전체 텍스트 검색을 수행 할 수 루프백 백엔드를 사용하려면 어떻게루프백 서버에서 admin-on-rest를 사용하는 전체 텍스트 필터 방법

const CatFilter = (props) => (
    <Filter {...props}> 
    <TextInput label="Search" source="CatCode" alwaysOn /> 
    </Filter> 
); 

을 그 가능한 경우 "포함"문자열을 검색합니다.

답변

2

두 가지 방법이 있습니다. 아래에서 두 가지 방법을 간략하게 설명합니다.

1) 루프백 전문 검색을 수행하려면 Regex 검색을 수행하는 사용자 지정 원격 메소드가 필요합니다. 정규 표현식 섹션에

https://loopback.io/doc/en/lb3/Where-filter.html

점프.

이것은 LB에서 텍스트 검색을하는 가장 좋은 방법이었습니다.

내 필터

const AdminFilter = (props) => { 
    return (<Filter {...props}> 
    <TextInput label="Name Or Email" source="userNameOrEmailId" alwaysOn /> 
    </Filter>) 
} 

이이 API 측에 다음과 같은 형식의 필터를 생성합니다.

const findUsersByNameOrEmail = (filter) => { 
    const regex = '^' + filter.where.userNameOrEmailId 
    filter.where.or = [{name: {'regexp': regex}}, {email: {'regexp': regex}}] 
    delete filter.where.userNameOrEmailId 
    return findAllUsersByFilter(filter) 
} 

const findAllUsersByFilter = (filter) => { 
    return AppUser.find(filter) 
} 

여기 약간의 해키는 위의 userNameOrEmail과 같은 필터에 더미 소스를 할당하는 것 같습니다. 그것은 실제로 모든 기본 우려를 무시하지 않습니다. 적절한 필터를 설정하는 데 도움이됩니다.

2) 위의 함수 findUsersByNameOrEmail이 사용자 정의 Rest Wrapper 또는 자신의 Rest Client에서 수행중인 필터 구성과 같은 작업을 수행하여 동일한 결과를 얻을 수도 있습니다. 나머지는 클라이언트 또는 래퍼입니다.

if (type === 'GET_LIST' && resource === 'appUser') { 
    const regex = '^' + params.userNameOrEmailId 
    const url = `URLroot/filter={where: [or: {name: {'regexp': regex}}, {email: {'regexp': regex}}] 
    options.method = 'GET'; 
    return handleRequestAndResponse(url, options) 
} 

아이디어는 귀하의 API 호출을 가로 채어 미리 필요한 것을 고치는 것입니다.

+0

하지만 어떻게 관리 - 온 - 나머지 정규식을 사용할 수 있습니까? –

+0

Rest On의 유일한 작업은 문자열을 API에 전달하는 것입니다. 해당 문자열을 가져 와서 RegexSearch에 전달하는 것은 사용자 지정 원격 메서드입니다. 더 자세한 내용으로 내 대답을 편집 할 것입니다. –

+0

그냥 참고 그냥 텍스트/ID 기반의 정규식 검색 및 접근 방식을 위에서 설명한 두 잘 구현 된 구현해야했습니다. 원격 메소드를 사용하지 않으려면 시도해 볼 수 있습니다. –

1

결국 나는 제대로 작동하는 해결책을 발견했다고 생각합니다. 문제가 간과되지 않아서 솔루션이 다른 사람을 도울 수 있거나 실수를 알게되기를 바랍니다. 먼저 나는 MongoDB를에 Text Index을 만들어 내가 직접 데이터베이스 쿼리 전체 텍스트 쿼리 "q"를 잡는다 만드는 다이 모델 name.js에 access operation-hook을 만들어 루프백에서

db.collection.createIndex({ "$**": "text" }) 

:

Clinic.observe('access', function logQuery(ctx, next) { 
    console.log('Accessing %s matching %s', JSON.stringify(ctx.Model.modelName), JSON.stringify(ctx.query.where)); 

    if (ctx && ctx.query && ctx.query.where && ctx.query.where.q) { 
     ctx.query.where = 
     {$text: 
     { 
     search: ctx.query.where.q, 
     language: "de", 
     caseSensitive: false, 
     diacriticSensitive: false 
     } 
    } 
    } 
    next(); 
    }); 

관리자 - 온 - 나머지 코드의 필터는 예에서와 같이 남아있다 : ​​

const CatFilter = (props) => { 
    return (<Filter {...props}> 
    <TextInput label="Full Text Search" source="q" alwaysOn /> 
    </Filter>) 
}