আমি একটি সাধারণ অনুসন্ধান ক্ষেত্র যুক্ত করতে চাইছি, এর মতো কিছু ব্যবহার করতে চাই
collectionRef.where('name', 'contains', 'searchTerm')
আমি চেষ্টা করার চেষ্টা করেছি where('name', '==', '%searchTerm%')
, কিন্তু এটি কিছুই ফেরেনি।
আমি একটি সাধারণ অনুসন্ধান ক্ষেত্র যুক্ত করতে চাইছি, এর মতো কিছু ব্যবহার করতে চাই
collectionRef.where('name', 'contains', 'searchTerm')
আমি চেষ্টা করার চেষ্টা করেছি where('name', '==', '%searchTerm%')
, কিন্তু এটি কিছুই ফেরেনি।
উত্তর:
সেখানে তেমন কোন অপারেটর এর অনুমতি দেওয়া বেশী ==
, <
, <=
, >
, >=
।
আপনি কেবল উপসর্গ দ্বারা ফিল্টার করতে পারেন, উদাহরণস্বরূপ যেগুলির মধ্যে শুরু হয় bar
এবং foo
আপনি ব্যবহার করতে পারেন তার জন্য
collectionRef.where('name', '>=', 'bar').where('name', '<=', 'foo')
আপনি এর জন্য অ্যালগোলিয়া বা ইলাস্টিক অনুসন্ধানের মতো বাহ্যিক পরিষেবা ব্যবহার করতে পারেন ।
tennis
তবে কোয়েরি অপারেটরগুলির উপর ভিত্তি করে এই ফলাফলগুলি পাওয়ার কোনও উপায় নেই। সংমিশ্রণ >=
এবং <=
কাজ করে না। অবশ্যই আমি অ্যালগোলিয়া ব্যবহার করতে পারি তবে ফায়ারবেস ব্যবহার করে বেশিরভাগ অনুসন্ধান করতে পারি এবং ফায়ারস্টোরে যাওয়ার দরকার পড়ে না ...
আমি @ কুবার জবাবের সাথে একমত, তবে তবুও, উপসর্গ দ্বারা অনুসন্ধানের জন্য নিখুঁতভাবে কাজ করার জন্য এটি একটি সামান্য পরিবর্তন যুক্ত করতে হবে। এখানে আমার জন্য কি কাজ
নাম দিয়ে শুরু রেকর্ড অনুসন্ধান queryText
collectionRef.where('name', '>=', queryText).where('name', '<=', queryText+ '\uf8ff')
।
\uf8ff
ক্যোয়ারীতে ব্যবহৃত চরিত্রটি ইউনিকোড পরিসরে একটি খুব উচ্চ কোড পয়েন্ট (এটি একটি ব্যক্তিগত ব্যবহারের ক্ষেত্র [PUA] কোড)। কারণ এটি ইউনিকোডের বেশিরভাগ নিয়মিত অক্ষরের পরে, কোয়েরিটি শুরু হওয়া সমস্ত মানের সাথে মিলে queryText
।
যদিও কূবার উত্তর সীমাবদ্ধতা অবধি ঠিক আছে, আপনি সেট-এর মতো কাঠামোর সাথে আংশিকভাবে এটিকে অনুকরণ করতে পারেন:
{
'terms': {
'reebok': true,
'mens': true,
'tennis': true,
'racket': true
}
}
এখন আপনি সাথে জিজ্ঞাসা করতে পারেন
collectionRef.where('terms.tennis', '==', true)
এটি কাজ করে কারণ ফায়ারস্টোর প্রতিটি ক্ষেত্রের জন্য স্বয়ংক্রিয়ভাবে একটি সূচক তৈরি করবে। দুর্ভাগ্যক্রমে এটি যৌগিক প্রশ্নের জন্য সরাসরি কাজ করে না কারণ ফায়ারস্টোর স্বয়ংক্রিয়ভাবে যৌগিক সূচকগুলি তৈরি করে না।
আপনি এখনও শব্দের সংমিশ্রণগুলি সংরক্ষণ করে এটিকে ঘিরে কাজ করতে পারেন তবে এটি কুরুচিপূর্ণ হয়ে ওঠে।
আউটবোর্ড পূর্ণ পাঠ্য অনুসন্ধানের মাধ্যমে আপনি সম্ভবত আরও ভাল ।
where
যদিও ফায়ারবেস স্পষ্টভাবে কোনও স্ট্রিংয়ের মধ্যে শব্দটির সন্ধানে সমর্থন করে না,
ফায়ারবেস (এখন) নিম্নলিখিতগুলি সমর্থন করে যা আপনার কেস এবং আরও অনেকের জন্য সমাধান করবে:
আগস্ট 2018 পর্যন্ত তারা array-contains
কোয়েরি সমর্থন করে । দেখুন: https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html
আপনি এখন আপনার সমস্ত মূল পদটি একটি ক্ষেত্র হিসাবে অ্যারেতে সেট করতে পারেন তারপরে 'এক্স' থাকা অ্যারে থাকা সমস্ত নথির জন্য কোয়েরি করুন। আপনি অতিরিক্ত প্রশ্নের জন্য আরও তুলনা করতে লজিকাল এবং ব্যবহার করতে পারেন । (এটি কারণ ফায়ারবেস বর্তমানে একাধিক অ্যারে -যুক্ত প্রশ্নের জন্য স্থানীয়ভাবে যৌগিক ক্যোয়ারিকে সমর্থন করে না তাই ক্লায়েন্টের শেষে 'এবং' বাছাই করা প্রশ্নগুলি করতে হবে)
এই স্টাইলে অ্যারেগুলি ব্যবহার করে তাদের সমবর্তী লেখাগুলির জন্য অনুকূলিতকরণের সুযোগ দেওয়া হবে যা দুর্দান্ত! পরীক্ষিত হয়নি যে এটি ব্যাচের অনুরোধগুলিকে সমর্থন করে (ডক্স বলবে না) তবে আমি এটির একটি দাপ্তরিক সমাধানের পরে বাজেয়াজ করব।
collection("collectionPath").
where("searchTermsArray", "array-contains", "term").get()
Search term
সাধারণত পুরো শব্দটিকে উভয় পক্ষের স্থান, বিরামচিহ্ন ইত্যাদি দ্বারা পৃথক করে বোঝানো হয়। আপনি Google যদি abcde
ডান এখন আপনি শুধুমাত্র ভালো জিনিস এর জন্য ফলাফল পাবেন %20abcde.
বা ,abcde!
কিন্তু abcdefghijk..
। যদিও টাইপ করা পুরো বর্ণমালাটি ইন্টারনেটে পাওয়া বেশি দেখা যায়, তল্লাশি আবদ্ধের জন্য নয় * এটি কোনও বিচ্ছিন্ন আবৃত্তিকার জন্য
'contains'
, যার অর্থ অনেকগুলি প্রোগ্রামিং ভাষায় আমি ঠিক কী উল্লেখ করছি। এটি '%searchTerm%'
একটি এসকিউএল অবস্থান থেকেও যায় ।
প্রতি Firestore ডক্স , ক্লাউড Firestore নথি টেক্সট ক্ষেত্রের জন্য অনুসন্ধান নেটিভ ইন্ডেক্স সমর্থন করে না অথবা। অতিরিক্তভাবে, ক্ষেত্রের ক্লায়েন্ট-সাইড অনুসন্ধানের জন্য একটি সম্পূর্ণ সংগ্রহ ডাউনলোড করা কার্যকর নয়।
আলগোলিয়া এবং ইলাস্টিক অনুসন্ধানের মতো তৃতীয় পক্ষের অনুসন্ধান সমাধানগুলি প্রস্তাবিত।
1.) \uf8ff
একইভাবে কাজ করে~
২) আপনি এমন একটি ক্লজ ব্যবহার করতে পারেন যেখানে ক্লজ বা শেষ ক্লজগুলি শুরু করতে পারেন:
ref.orderBy('title').startAt(term).endAt(term + '~');
ঠিক হিসাবে একই
ref.where('title', '>=', term).where('title', '<=', term + '~');
৩) না, আপনি বিপরীত startAt()
এবং endAt()
প্রতিটি সংমিশ্রণে এটি কাজ করে না , তবে, আপনি বিপরীত দ্বিতীয় সন্ধান ক্ষেত্র তৈরি করে এবং ফলাফলগুলিকে একত্রিত করে একই ফলাফল অর্জন করতে পারেন।
উদাহরণ: ক্ষেত্রটি তৈরি হওয়ার পরে প্রথমে আপনাকে ক্ষেত্রটির বিপরীত সংস্করণ সংরক্ষণ করতে হবে। এটার মতো কিছু:
// collection
const postRef = db.collection('posts')
async function searchTitle(term) {
// reverse term
const termR = term.split("").reverse().join("");
// define queries
const titles = postRef.orderBy('title').startAt(term).endAt(term + '~').get();
const titlesR = postRef.orderBy('titleRev').startAt(termR).endAt(termR + '~').get();
// get queries
const [titleSnap, titlesRSnap] = await Promise.all([
titles,
titlesR
]);
return (titleSnap.docs).concat(titlesRSnap.docs);
}
এটির সাহায্যে আপনি একটি স্ট্রিং ফিল্ডের শেষ অক্ষর এবং প্রথমটি অনুসন্ধান করতে পারেন , কেবল এলোমেলো মাঝারি অক্ষর বা অক্ষরের দল নয়। এটি কাঙ্ক্ষিত ফলাফলের কাছাকাছি। যাইহোক, আমরা যখন এলোমেলো মাঝারি অক্ষর বা শব্দ চাই তখন এটি সত্যই আমাদের সহায়তা করবে না। এছাড়াও, সমস্ত ছোট হাতের অক্ষর বা অনুসন্ধানের জন্য একটি ছোট হাতের অনুলিপি সংরক্ষণ করতে ভুলবেন না, তাই কেস কোনও সমস্যা হবে না।
৪) যদি আপনার কাছে কেবল কয়েকটি শব্দ থাকে তবে কেন ট্যানের পদ্ধতিটি আপনি যা চান তা করবে বা কমপক্ষে আপনি কিছুটা সংশোধন করার পরে করবেন। তবে, কেবলমাত্র একটি অনুচ্ছেদে পাঠ্যের সাহায্যে আপনি তাত্ক্ষণিকভাবে 1MB এর বেশি ডেটা তৈরি করতে পারবেন যা ফায়ার স্টোরের নথির আকারের সীমা থেকে বড় (আমি জানি, আমি এটি পরীক্ষা করেছি)।
৫) আপনি যদি কৌতুকের সাথে অ্যারে-অন্তর্ভুক্ত (বা অ্যারেগুলির কোনও ফর্ম) একত্রিত করতে পারেন তবে আপনি \uf8ff
একটি কার্যকর অনুসন্ধান করতে পারেন যা সীমাতে পৌঁছায় না। আমি প্রতিটি সংমিশ্রণ চেষ্টা করেছি, এমনকি মানচিত্র এবং কোনও যেতে নেই with যে কেউ এটি পরিসংখ্যান, এটি এখানে পোস্ট করুন।
)) যদি আপনাকে অবশ্যই আলেগোলিয়া এবং ইলাস্টিক অনুসন্ধান থেকে দূরে চলে যেতে হয় এবং আমি আপনাকে মোটেই দোষ না দিই তবে আপনি সর্বদা গুগল ক্লাউডে মাইএসকিউএল, পোস্টএসকিউএল বা নিও 4 জ ব্যবহার করতে পারেন। এগুলি 3 টি সেট আপ করা সহজ এবং এগুলি বিনামূল্যে স্তর রয়েছে। ডাটা সন্ধান করার জন্য অনক্রিট () এবং অন্য একটি কল () ফাংশন সংরক্ষণ করার জন্য আপনার কাছে একটি ক্লাউড ফাংশন থাকবে। সরল ... ইশ কেন তখন শুধু মাইএসকিউএল এ স্যুইচ করবেন না? রিয়েল-টাইম ডেটা অবশ্যই! যখন কেউ রিয়েল-টাইম ডেটার জন্য ওয়েবগ্রক্সের সাথে ডিজিগ্রাফ লেখেন, তখন আমাকে গণনা করুন!
অ্যালগোলিয়া এবং ইলাস্টিকস অনুসন্ধানগুলি কেবলমাত্র অনুসন্ধানের ডিবিএস হিসাবে নির্মিত হয়েছিল, তাই তাত্পর্য হিসাবে আর কিছুই নেই ... তবে আপনি এটির জন্য অর্থ প্রদান করেন। গুগল, আপনি কেন আমাদের গুগল থেকে দূরে নিয়ে যান, এবং আপনি মঙ্গোডিবি নোএসকিউএল অনুসরণ করেন না এবং অনুসন্ধানগুলি অনুমতি দিচ্ছেন না?
আপডেট - আমি একটি সমাধান তৈরি করেছি:
দেরী উত্তর তবে যে কেউ এখনও উত্তর খুঁজছেন, তাদের জন্য বলুন যে আমাদের ব্যবহারকারীর সংগ্রহ রয়েছে এবং সংগ্রহের প্রতিটি নথিতে আমাদের একটি "ব্যবহারকারীর নাম" ক্ষেত্র রয়েছে, সুতরাং যদি একটি নথির সন্ধান করতে চান যেখানে "আল" দিয়ে ব্যবহারকারীর নাম শুরু হয় আমরা যেমন কিছু করতে পারি
FirebaseFirestore.getInstance().collection("users").whereGreaterThanOrEqualTo("username", "al")
আমি নিশ্চিত ফায়ারবেস শীঘ্রই কোনও সূচক ক্যাপচার করার জন্য শীঘ্রই "স্ট্রিং-ইনটেন্ডস" নিয়ে বেরিয়ে আসবে [i] স্ট্রিংয়ে এটি ... তবে আমি ওয়েবগুলি অনুসন্ধান করেছি এবং এই সমাধানটি অন্য কারও দ্বারা আপনার ডেটা সেট আপ করার মতো ভেবে দেখেছি এই
state = {title:"Knitting"}
...
const c = this.state.title.toLowerCase()
var array = [];
for (let i = 1; i < c.length + 1; i++) {
array.push(c.substring(0, i));
}
firebase
.firestore()
.collection("clubs")
.doc(documentId)
.update({
title: this.state.title,
titleAsArray: array
})
এই মত জিজ্ঞাসা
firebase
.firestore()
.collection("clubs")
.where(
"titleAsArray",
"array-contains",
this.state.userQuery.toLowerCase()
)
আপনি যদি অ্যালগোলিয়ার মতো তৃতীয় পক্ষের পরিষেবাটি ব্যবহার করতে না চান তবে ফায়ারবেস ক্লাউড ফাংশনগুলি দুর্দান্ত বিকল্প। আপনি একটি ফাংশন তৈরি করতে পারেন যা একটি ইনপুট প্যারামিটার গ্রহণ করতে পারে, রেকর্ড সার্ভার-সাইডের মাধ্যমে প্রক্রিয়া করতে পারে এবং তারপরে আপনার মানদণ্ডের সাথে মেলে এমনগুলি ফিরিয়ে দেয়।
নির্বাচিত উত্তরটি কেবল সঠিক অনুসন্ধানগুলির জন্য কাজ করে এবং এটি প্রাকৃতিক ব্যবহারকারীর অনুসন্ধানের আচরণ নয় ("জো আজ একটি অ্যাপল খেয়েছে" "আপেল" অনুসন্ধান করা কাজ করবে না)।
আমি মনে করি উপরের ড্যান ফিনের উত্তরটি উচ্চতর হওয়া উচিত। আপনি যে স্ট্রিং ডেটাটি অনুসন্ধান করছেন তা যদি সংক্ষিপ্ত হয়, আপনি স্ট্রিংয়ের সমস্ত সাবস্ট্রিংগুলি আপনার নথির একটি অ্যারেতে সংরক্ষণ করতে পারেন এবং তারপরে ফায়ারবেসের অ্যারে_সামগ্রী কোয়েরি দিয়ে অ্যারের মাধ্যমে অনুসন্ধান করতে পারেন। ফায়ারবেস ডকুমেন্টস 1 টি এমআইবি (1,048,576 বাইট) ( ফায়ারবেস কোটা এবং সীমাবদ্ধতা ) এর মধ্যে সীমাবদ্ধ যা একটি নথিতে প্রায় 1 মিলিয়ন অক্ষর সংরক্ষণ করা হয়েছে (আমি মনে করি 1 টি অক্ষর 1 = 1 বাইট)। সাবস্ক্রিংগুলি সংরক্ষণ করা ঠিক আছে যতক্ষণ না আপনার নথিটি 1 মিলিয়ন চিহ্নের কাছাকাছি না fine
ব্যবহারকারীর নাম অনুসন্ধানের উদাহরণ:
পদক্ষেপ 1: আপনার প্রকল্পে নিম্নলিখিত স্ট্রিং এক্সটেনশন যুক্ত করুন। এটি আপনাকে সহজেই সাবস্ট্রিংগুলিতে একটি স্ট্রিং বিভক্ত করতে দেয়। ( আমি এটি এখানে পেয়েছি )।
extension String {
var length: Int {
return count
}
subscript (i: Int) -> String {
return self[i ..< i + 1]
}
func substring(fromIndex: Int) -> String {
return self[min(fromIndex, length) ..< length]
}
func substring(toIndex: Int) -> String {
return self[0 ..< max(0, toIndex)]
}
subscript (r: Range<Int>) -> String {
let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)),
upper: min(length, max(0, r.upperBound))))
let start = index(startIndex, offsetBy: range.lowerBound)
let end = index(start, offsetBy: range.upperBound - range.lowerBound)
return String(self[start ..< end])
}
পদক্ষেপ 2: আপনি যখন কোনও ব্যবহারকারীর নাম সঞ্চয় করেন, তখন এই ফাংশনের ফলাফলটিকে একই ডকুমেন্টে অ্যারে হিসাবে সংরক্ষণ করুন। এটি মূল পাঠ্যের সমস্ত প্রকারভেদ তৈরি করে এবং এগুলিতে সংরক্ষণ করে। উদাহরণস্বরূপ, "অ্যাপল" পাঠ্য ইনপুট নিম্নলিখিত অ্যারে তৈরি করবে: ["ক", "পি", "পি", "এল", "ই", "এপি", "পিপি", "পিএল", "লে "," অ্যাপ "," পিপিএল "," পিএল "," অ্যাপল "," পিপল "," আপেল "], যা কোনও ব্যবহারকারী প্রবেশ করতে পারে এমন সমস্ত অনুসন্ধানের মানদণ্ডকে অন্তর্ভুক্ত করে। আপনি যদি সব ফলাফল চান তবে আপনি সর্বোচ্চ স্ট্রিংসাইজকে শূন্য হিসাবে ছেড়ে দিতে পারেন, তবে, যদি দীর্ঘ পাঠ্য থাকে, তবে নথির আকার খুব বড় হওয়ার আগে আমি এটি ক্যাপ করার পরামর্শ দেব - কোথাও আমার পক্ষে প্রায় 15 টি জরিমানা কাজ করে (বেশিরভাগ লোক লম্বা বাক্যাংশ যাইহোক অনুসন্ধান করেন না) )।
func createSubstringArray(forText text: String, maximumStringSize: Int?) -> [String] {
var substringArray = [String]()
var characterCounter = 1
let textLowercased = text.lowercased()
let characterCount = text.count
for _ in 0...characterCount {
for x in 0...characterCount {
let lastCharacter = x + characterCounter
if lastCharacter <= characterCount {
let substring = textLowercased[x..<lastCharacter]
substringArray.append(substring)
}
}
characterCounter += 1
if let max = maximumStringSize, characterCounter > max {
break
}
}
print(substringArray)
return substringArray
}
পদক্ষেপ 3: আপনি ফায়ারবেসের অ্যারে_ কনটেনস ফাংশনটি ব্যবহার করতে পারেন!
[yourDatabasePath].whereField([savedSubstringArray], arrayContains: searchText).getDocuments....
আমি এই সমস্যাটি পেয়েছি এবং একটি খুব সহজ সমাধান নিয়ে এসেছি।
String search = "ca";
Firestore.instance.collection("categories").orderBy("name").where("name",isGreaterThanOrEqualTo: search).where("name",isLessThanOrEqualTo: search+"z")
IsGreaterThanOrEqualTo আমাদের অনুসন্ধানের শুরুটি ফিল্টার আউট করতে দেয় এবং isLessThanOrEqualT এর শেষে একটি "z" যুক্ত করে আমরা আমাদের অনুসন্ধানটি পরবর্তী নথিগুলিতে রোল না করার জন্য ক্যাপ করি।
আমি আসলে ফায়ারস্টোরের মধ্যে এটি করার সর্বোত্তম সমাধানটি হ'ল সমস্ত সাবস্ট্রিংগুলিকে একটি অ্যারেতে রাখা এবং কেবল একটি অ্যারে_সামগ্রী অনুসন্ধান করা। এটি আপনাকে সাবস্ট্রিং ম্যাচিং করতে দেয়। সমস্ত সাবস্ট্রিংগুলি সঞ্চয় করার জন্য কিছুটা ওভারকিল তবে আপনার অনুসন্ধানের পদগুলি যদি ছোট হয় তবে এটি খুব যুক্তিসঙ্গত।
ফায়ারস্টোরের সাহায্যে আপনি একটি সম্পূর্ণ পাঠ্য অনুসন্ধান কার্যকর করতে পারেন তবে এটি অন্যথায় পড়ার চেয়ে আরও বেশি পড়তে পারে এবং আপনাকে একটি নির্দিষ্ট উপায়ে ডেটা প্রবেশ ও সূচীকরণ করতে হবে, সুতরাং এই পদ্ধতির মাধ্যমে আপনি ফায়ারবেস ক্লাউড ফাংশনগুলি ব্যবহার করতে পারেন টোকেনাইজ এবং তারপরে আপনার ইনপুট পাঠ্যটি হ্যাশ করুন যখন লিনিয়ার হ্যাশ ফাংশনটি বেছে নিন h(x)
যা নিম্নলিখিতগুলিকে সন্তুষ্ট করে - যদি x < y < z then h(x) < h (y) < h(z)
। টোকেনাইজেশনের জন্য আপনি আপনার ফাংশনের শীতল শুরুর সময় কম রাখার জন্য কিছু হালকা এনএলপি লাইব্রেরি বেছে নিতে পারেন যা আপনার বাক্য থেকে অপ্রয়োজনীয় শব্দগুলি ছড়িয়ে দিতে পারে। তারপরে আপনি ফায়ার স্টোরে অপারেটরের চেয়ে কম এবং এর চেয়ে বেশি দিয়ে একটি ক্যোয়ারী চালাতে পারেন। আপনার ডেটা সংরক্ষণ করার সময়, আপনাকে অবশ্যই এটি সংরক্ষণ করতে হবে তা নিশ্চিত করে নিতে হবে এবং আপনি সরল পাঠ্যটি সংরক্ষণ করে রাখবেন যেন আপনি সরল পাঠ্য পরিবর্তন করেন তবে হ্যাশ মানটিও পরিবর্তিত হবে।
এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে তবে পারফরম্যান্স সমস্যার কারণ হতে পারে।
অগ্নিকান্ডার অনুসন্ধানের সময় এটি করুন:
Future<QuerySnapshot> searchResults = collectionRef
.where('property', isGreaterThanOrEqualTo: searchQuery.toUpperCase())
.getDocuments();
আপনার ফিউচারবিল্ডারে এটি করুন:
return FutureBuilder(
future: searchResults,
builder: (context, snapshot) {
List<Model> searchResults = [];
snapshot.data.documents.forEach((doc) {
Model model = Model.fromDocumet(doc);
if (searchQuery.isNotEmpty &&
!model.property.toLowerCase().contains(searchQuery.toLowerCase())) {
return;
}
searchResults.add(model);
})
};
আজকের হিসাবে, মূলত 3 টি আলাদা আলাদা কর্মক্ষেত্র রয়েছে, যা বিশেষজ্ঞদের দ্বারা প্রশ্নের উত্তর হিসাবে পরামর্শ দিয়েছিল।
আমি তাদের সব চেষ্টা করেছি। আমি ভেবেছিলাম তাদের প্রত্যেকের সাথে আমার অভিজ্ঞতা নথিভুক্ত করা কার্যকর হতে পারে।
পদ্ধতি-এ: ব্যবহার করে: (dbField "> =" অনুসন্ধানের স্ট্রিং) & (ডিবিফিল্ড "<=" অনুসন্ধানের স্ট্রিং + "\ uf8ff")
@ কুবা এবং @ অঙ্কিত প্রজাপতি দ্বারা প্রস্তাবিত
.where("dbField1", ">=", searchString)
.where("dbField1", "<=", searchString + "\uf8ff");
এ .১ ফায়ারস্টোর ক্যোরিগুলি কেবলমাত্র একক ক্ষেত্রে রেঞ্জ ফিল্টার (>, <,> =, <=) সম্পাদন করতে পারে। একাধিক ক্ষেত্রের ব্যাপ্তি ফিল্টার সহ প্রশ্নগুলি সমর্থিত নয়। এই পদ্ধতিটি ব্যবহার করে আপনার ডিবিতে অন্য কোনও ক্ষেত্রে রেঞ্জ অপারেটর থাকতে পারে না, যেমন একটি তারিখের ক্ষেত্র।
ক .২। এই পদ্ধতিটি একই সাথে একাধিক ক্ষেত্রে অনুসন্ধানের জন্য কাজ করে না। উদাহরণস্বরূপ, অনুসন্ধানের স্ট্রিং ফাইলড (নাম, নোট এবং ঠিকানা) কোনওর মধ্যে রয়েছে কিনা তা আপনি পরীক্ষা করতে পারবেন না।
পদ্ধতি-বি: মানচিত্রে প্রতিটি প্রবেশের জন্য "সত্য" দিয়ে অনুসন্ধানের স্ট্রিংয়ের একটি এমএপি ব্যবহার করা এবং প্রশ্নের মধ্যে "==" অপারেটর ব্যবহার করা
@ গিল গিলবার্ট প্রস্তাবিত
document1 = {
'searchKeywordsMap': {
'Jam': true,
'Butter': true,
'Muhamed': true,
'Green District': true,
'Muhamed, Green District': true,
}
}
.where(`searchKeywordsMap.${searchString}`, "==", true);
B.1 স্পষ্টতই, এই পদ্ধতিটিতে প্রতিবার ডেবিতে সংরক্ষণ করার সময় অতিরিক্ত প্রক্রিয়াজাতকরণ প্রয়োজন এবং আরও গুরুত্বপূর্ণ, অনুসন্ধান স্ট্রিংয়ের মানচিত্রটি সঞ্চয় করার জন্য অতিরিক্ত স্থান প্রয়োজন।
B.2 যদি ফায়ার স্টোর ক্যোয়ারীর উপরের মতো একটি একক শর্ত থাকে তবে আগে কোনও সূচি তৈরি করার প্রয়োজন নেই। এই সমাধানটি এক্ষেত্রে ঠিক কাজ করবে।
B.3 তবে, যদি ক্যোয়ারির অন্য শর্ত থাকে, যেমন (স্থিতি === "সক্রিয়")) মনে হয় যে ব্যবহারকারী প্রতিটি "অনুসন্ধান স্ট্রিং" প্রবেশ করানোর জন্য একটি সূচক প্রয়োজন। অন্য কথায়, যদি কোনও ব্যবহারকারী "জাম" অনুসন্ধান করেন এবং অন্য ব্যবহারকারী "বাটার" অনুসন্ধান করেন, "জাম" স্ট্রিংয়ের জন্য আগেই একটি সূচক তৈরি করা উচিত এবং অন্যটি "বাটার" ইত্যাদির জন্য, ইত্যাদি আপনি সমস্ত সম্ভাবনার পূর্বাভাস না দিলে ব্যবহারকারীর অনুসন্ধানের স্ট্রিং, এটি কাজ করে না - কোয়েরির ক্ষেত্রে অন্যান্য শর্ত রয়েছে!
.where(searchKeywordsMap["Jam"], "==", true); // requires an index on searchKeywordsMap["Jam"]
.where("status", "==", "active");
** পদ্ধতি-সি: অনুসন্ধানের স্ট্রিংগুলির একটি আরআরএ ব্যবহার করে, এবং "অ্যারে -যুক্ত" অপারেটর
@ অ্যালবার্ট রেনশো দ্বারা প্রস্তাবিত এবং @ নিক কার্ডুচি দ্বারা প্রদর্শিত
document1 = {
'searchKeywordsArray': [
'Jam',
'Butter',
'Muhamed',
'Green District',
'Muhamed, Green District',
]
}
.where("searchKeywordsArray", "array-contains", searchString);
C.1 পদ্ধতি-বি এর অনুরূপ, এই পদ্ধতিটির জন্য প্রত্যেক সময় ডেটা ডিবিতে সংরক্ষণ করার সময় অতিরিক্ত প্রক্রিয়াজাতকরণ প্রয়োজন, এবং আরও গুরুত্বপূর্ণ, অনুসন্ধান স্ট্রিংগুলির অ্যারে সঞ্চয় করতে অতিরিক্ত স্থান প্রয়োজন।
সি .২ ফায়ারস্টোর ক্যোয়ারিতে যৌগিক ক্যোয়ারিতে সর্বাধিক একটি "অ্যারে-অন্তর্ভুক্ত" বা "অ্যারে-অন্তর্ভুক্ত-যে কোনও" ধারা অন্তর্ভুক্ত থাকতে পারে।
সাধারণ সীমাবদ্ধতা:
এমন কোনও সমাধান নেই যা সমস্ত মানায়। প্রতিটি workaround এর সীমাবদ্ধতা আছে। আমি আশা করি উপরের তথ্যগুলি এই কাজের ক্ষেত্রগুলির মধ্যে বাছাই প্রক্রিয়া চলাকালীন আপনাকে সহায়তা করতে পারে।
ফায়ারস্টোর ক্যোয়ারী শর্তগুলির তালিকার জন্য, দয়া করে ডকুমেন্টেশনটি https://firebase.google.com/docs/firestore/query-data/queries দেখুন ।
আমি https://fireblog.io/blog/post/firestore-full-text-search চেষ্টা করিনি , যা @ জোনাথন প্রস্তাবিত।
স্ট্রিংয়ের মান মুদ্রণ করতে আমরা ব্যাক-টিক ব্যবহার করতে পারি। এই কাজ করা উচিত:
where('name', '==', `${searchTerm}`)