파이어베이스에서 SQL "LIKE" 작업을 수행하는 방법은 무엇입니까?
저는 데이터 저장을 위해 파이어베이스를 사용하고 있습니다.데이터 구조는 다음과 같습니다.
products:{
product1:{
name:"chocolate",
}
product2:{
name:"chochocho",
}
}
이 데이터에 대해 자동 완료 작업을 수행하고 일반적으로 다음과 같은 쿼리를 작성합니다.
"select name from PRODUCTS where productname LIKE '%" + keyword + "%'";
그래서 예를 들어 사용자가 "cho"를 입력하면 결과적으로 "chochocho"와 "chochocho"를 모두 가져와야 합니다.저는 모든 데이터를 "제품" 블록 아래로 가져온 다음 클라이언트에서 쿼리를 수행하려고 생각했습니다. 하지만 이것은 큰 데이터베이스를 위해 많은 메모리가 필요할 수도 있습니다.그럼 어떻게 하면 sql LIKE 작업을 수행할 수 있을까요?
감사해요.
업데이트: Firebase용 Cloud Functions 릴리스에서는 Functions를 통해 Firebase와 Algolia를 연결함으로써 이를 수행할 수 있는 또 다른 방법이 있습니다.여기서 단점은 기능/알골리아가 거의 유지보수가 되지 않는다는 것입니다. 그러나 아마도 노드에서 롤 유어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어 오어
현재 Firebase에는 내용 검색이 없습니다.API가 계속 확장됨에 따라 속성별 검색과 같은 더 일반적인 검색 시나리오의 대부분이 Firebase로 구워질 것입니다.
그 동안, 여러분만의 것을 키우는 것은 확실히 가능합니다.그러나 검색은 방대한 주제(실시간 데이터 저장소를 방대하게 만드는 것)이며, 크게 과소평가되며, 애플리케이션의 중요한 기능입니다. Firebase와 같은 사용자가 사용자를 대신하여 제공하기 위해 임시로 제공하거나 의존할 필요는 없습니다.따라서 일반적으로 인덱싱, 검색, 태그/패턴 매칭, 퍼지 논리, 가중치 순위 등을 처리하기 위해 확장 가능한 타사 툴을 사용하는 것이 더 간단합니다.
Firebase 블로그에는 ElasticSearch를 통한 인덱싱에 대한 블로그 게시물이 포함되어 있습니다. 이 블로그는 빠르고 매우 강력한 검색 엔진을 Firebase 백엔드에 통합하기 위한 간단한 접근 방식을 설명합니다.
기본적으로 두 단계로 이루어집니다.데이터 모니터링 및 인덱싱:
var Firebase = require('firebase');
var ElasticClient = require('elasticsearchclient')
// initialize our ElasticSearch API
var client = new ElasticClient({ host: 'localhost', port: 9200 });
// listen for changes to Firebase data
var fb = new Firebase('<INSTANCE>.firebaseio.com/widgets');
fb.on('child_added', createOrUpdateIndex);
fb.on('child_changed', createOrUpdateIndex);
fb.on('child_removed', removeIndex);
function createOrUpdateIndex(snap) {
client.index(this.index, this.type, snap.val(), snap.name())
.on('data', function(data) { console.log('indexed ', snap.name()); })
.on('error', function(err) { /* handle errors */ });
}
function removeIndex(snap) {
client.deleteDocument(this.index, this.type, snap.name(), function(error, data) {
if( error ) console.error('failed to delete', snap.name(), error);
else console.log('deleted', snap.name());
});
}
검색을 수행할 때 인덱스를 쿼리합니다.
<script src="elastic.min.js"></script>
<script src="elastic-jquery-client.min.js"></script>
<script>
ejs.client = ejs.jQueryClient('http://localhost:9200');
client.search({
index: 'firebase',
type: 'widget',
body: ejs.Request().query(ejs.MatchQuery('title', 'foo'))
}, function (error, response) {
// handle response
});
</script>
여기 통합을 단순화하기 위한 예와 타사 lib가 있습니다.
저는 당신이 할 수 있다고 믿습니다.
admin
.database()
.ref('/vals')
.orderByChild('name')
.startAt('cho')
.endAt("cho\uf8ff")
.once('value')
.then(c => res.send(c.val()));
이것은 이름이 cho로 시작하는 vals를 찾을 것입니다.
탄력적인 검색 솔루션은 기본적으로 add set del에 바인딩되며 텍스트 검색을 수행할 수 있는 getby를 제공합니다.그런 다음 내용을 mongodb에 저장합니다.
저는 프로젝트의 완성도에 대한 탄력적인 검색을 사랑하고 추천하지만, 파이어베이스 데이터베이스만 사용하여 다른 서버 없이도 동일한 작업을 수행할 수 있습니다.그게 제 말입니다: (https://github.com/metaschema/oxyzen)
인덱싱 파트의 경우 기본적으로 다음 기능을 수행합니다.
- JSON은 문서를 문자열화합니다.
- 모든 속성 이름과 JSON을 제거하여 데이터(regex)만 남깁니다.
- 는 xml 또는 html이 있는 경우 순수 텍스트만 남기도록 모든 xml 태그(html도 포함) 및 특성(이전 지침 "데이터가 xml 특성에 있으면 안 됩니다")을 제거합니다.
- 모든 특수 문자를 제거하고 공백으로 대체(정규식)
- 여러 공간의 모든 인스턴스를 하나의 공간(regex)으로 대체합니다.
- 공백 및 주기로 분할:
- 각 단어는 기본적으로 "ref/in the database/dockey"의 이스케이프 버전을 가진 단어로 명명된 하위 단어를 포함하는 DB의 일부 인덱스 구조의 문서에 참조를 추가합니다.
- 그런 다음 일반 파이어베이스 애플리케이션이 하는 것처럼 문서를 삽입합니다.
oxyzen 구현에서 문서의 후속 업데이트는 실제로 인덱스를 읽고 업데이트하여 더 이상 일치하지 않는 단어를 제거하고 새 단어를 추가합니다.
후속 단어 검색은 단어의 문서를 직접 찾을 수 있습니다. 여러 단어 검색은 히트를 사용하여 구현됩니다.
SQL "LIKE" 작업이 firebase에서 가능합니다.
let node = await db.ref('yourPath').orderByChild('yourKey').startAt('!').endAt('SUBSTRING\uf8ff').once('value');
이 쿼리는 나에게 효과가 있으며 MySQL의 아래 문장처럼 보입니다.
select * from StoreAds where University Like %ps%;
query = database.getReference().child("StoreAds").orderByChild("University").startAt("ps").endAt("\uf8ff");
언급URL : https://stackoverflow.com/questions/22506531/how-to-perform-sql-like-operation-on-firebase
'programing' 카테고리의 다른 글
| 포드 파일에서 이 대상에 대한 플랫폼을 지정하시겠습니까? (0) | 2023.06.06 |
|---|---|
| 여러 조건에 따라 데이터 프레임을 부분 집합화 (0) | 2023.06.06 |
| 깃 분기를 보관하려면 어떻게 해야 합니까? (0) | 2023.06.06 |
| VB/VB.NET 코드 주석 차단 (0) | 2023.06.01 |
| Html.Partial vs Html.부분 & Html을 렌더링합니다.액션 대 HTML.렌더 작업 (0) | 2023.06.01 |