গুগল ফায়ার স্টোর: সম্পত্তি মান (পাঠ্য অনুসন্ধান) এর স্ট্রিংয়ের উপর প্রশ্ন


112

আমি একটি সাধারণ অনুসন্ধান ক্ষেত্র যুক্ত করতে চাইছি, এর মতো কিছু ব্যবহার করতে চাই

collectionRef.where('name', 'contains', 'searchTerm')

আমি চেষ্টা করার চেষ্টা করেছি where('name', '==', '%searchTerm%'), কিন্তু এটি কিছুই ফেরেনি।


4
ফায়ারবেস এখন এটি সমর্থন করে। দয়া করে উত্তরটি আপডেট করুন: স্ট্যাকওভারফ্লো.com
অ্যালবার্ট রেনশো

4
আমি মনে করি সর্বোত্তম উপায় হ'ল একটি স্ক্রিপ্ট তৈরি করা যা প্রতিটি নথিকে ম্যানুয়ালি সূচক করে। তারপরে সেই সূচিগুলি জিজ্ঞাসা করুন। এটি দেখুন: Angularfirebase.com/lessons/…
কিবলাভি_রাবী

উত্তর:


42

সেখানে তেমন কোন অপারেটর এর অনুমতি দেওয়া বেশী ==, <, <=, >, >=

আপনি কেবল উপসর্গ দ্বারা ফিল্টার করতে পারেন, উদাহরণস্বরূপ যেগুলির মধ্যে শুরু হয় barএবং fooআপনি ব্যবহার করতে পারেন তার জন্য

collectionRef.where('name', '>=', 'bar').where('name', '<=', 'foo')

আপনি এর জন্য অ্যালগোলিয়া বা ইলাস্টিক অনুসন্ধানের মতো বাহ্যিক পরিষেবা ব্যবহার করতে পারেন ।


6
এটি আমি যা খুঁজছি তা পুরোপুরি নয়। আমার কাছে দীর্ঘ শিরোনামযুক্ত পণ্যগুলির একটি বৃহত তালিকা রয়েছে। "রেবোক মেনস টেনিস র‌্যাকেট"। কোনও ব্যবহারকারী সন্ধান করতে পারে tennisতবে কোয়েরি অপারেটরগুলির উপর ভিত্তি করে এই ফলাফলগুলি পাওয়ার কোনও উপায় নেই। সংমিশ্রণ >=এবং <=কাজ করে না। অবশ্যই আমি অ্যালগোলিয়া ব্যবহার করতে পারি তবে ফায়ারবেস ব্যবহার করে বেশিরভাগ অনুসন্ধান করতে পারি এবং ফায়ারস্টোরে যাওয়ার দরকার পড়ে না ...
tehfailsafe

5
@tehfailsafe আচ্ছা আপনার প্রশ্নটি হল 'ক্ষেত্রের একটি স্ট্রিং রয়েছে কিনা তা কীভাবে জিজ্ঞাসা করতে হবে' এবং প্রতিক্রিয়াটি 'আপনি এটি করতে পারবেন না'।
কুবা

21
@ এ.চ্যাকরউন আমার উত্তরে অভদ্রতা কী?
কুবা

21
tbh এটি সত্যিই প্রয়োজনীয় কিছু। ফায়ারবেসের দল কেন এ বিষয়ে ভাবি নি তা আমি বুঝতে পারি না
ড্যানি

4
সত্যিই অবাক করে ফায়ারবেস জিজ্ঞাসাবাদে এত দুর্বল। বিশ্বাস করা যায় না যে এত সাধারণ লোকেরা এটি ব্যবহার করছে যদি এটি এমন সাধারণ কোয়েরিকে সমর্থন করে না।
বাগসফ্লিয়ার

52

আমি @ কুবার জবাবের সাথে একমত, তবে তবুও, উপসর্গ দ্বারা অনুসন্ধানের জন্য নিখুঁতভাবে কাজ করার জন্য এটি একটি সামান্য পরিবর্তন যুক্ত করতে হবে। এখানে আমার জন্য কি কাজ

নাম দিয়ে শুরু রেকর্ড অনুসন্ধান queryText

collectionRef.where('name', '>=', queryText).where('name', '<=', queryText+ '\uf8ff')

\uf8ffক্যোয়ারীতে ব্যবহৃত চরিত্রটি ইউনিকোড পরিসরে একটি খুব উচ্চ কোড পয়েন্ট (এটি একটি ব্যক্তিগত ব্যবহারের ক্ষেত্র [PUA] কোড)। কারণ এটি ইউনিকোডের বেশিরভাগ নিয়মিত অক্ষরের পরে, কোয়েরিটি শুরু হওয়া সমস্ত মানের সাথে মিলে queryText


4
উত্তম উত্তর! এটি উপসর্গের পাঠ্যের সন্ধানের জন্য দুর্দান্ত কাজ করে। টেক্সট শব্দের অনুসন্ধান করার জন্য, চেষ্টা করতে পারেন এই পোস্টে ব্যাখ্যা হিসাবে "অ্যারে-রয়েছে" বাস্তবায়ন medium.com/@ken11zer01/...
guillefd

কেবল ভাবছেন, তবে তাত্ত্বিকভাবে আপনি ক্যোয়ার্টেস্টের সাথে শেষ হওয়া সমস্ত মানের সাথে অন্য ক্ষেত্র তৈরি করে এবং ডেটা উল্টিয়ে তুলতে পারেন ...
জোনাথন

হ্যাঁ জনাথন, এটিও সম্ভব।
অঙ্কিত প্রজাপতি

43

যদিও কূবার উত্তর সীমাবদ্ধতা অবধি ঠিক আছে, আপনি সেট-এর মতো কাঠামোর সাথে আংশিকভাবে এটিকে অনুকরণ করতে পারেন:

{
  'terms': {
    'reebok': true,
    'mens': true,
    'tennis': true,
    'racket': true
  }
}

এখন আপনি সাথে জিজ্ঞাসা করতে পারেন

collectionRef.where('terms.tennis', '==', true)

এটি কাজ করে কারণ ফায়ারস্টোর প্রতিটি ক্ষেত্রের জন্য স্বয়ংক্রিয়ভাবে একটি সূচক তৈরি করবে। দুর্ভাগ্যক্রমে এটি যৌগিক প্রশ্নের জন্য সরাসরি কাজ করে না কারণ ফায়ারস্টোর স্বয়ংক্রিয়ভাবে যৌগিক সূচকগুলি তৈরি করে না।

আপনি এখনও শব্দের সংমিশ্রণগুলি সংরক্ষণ করে এটিকে ঘিরে কাজ করতে পারেন তবে এটি কুরুচিপূর্ণ হয়ে ওঠে।

আউটবোর্ড পূর্ণ পাঠ্য অনুসন্ধানের মাধ্যমে আপনি সম্ভবত আরও ভাল ।


ক্লাউড জিমেইল / অ্যাপেনজিন / ডকস / স্ট্যান্ডার্ড / জাভা / অনুসন্ধানের সাথে কি ক্লাউড ফাংশন ব্যবহার করা সম্ভব ?
হেনরি

4
আপনি যদি এই উত্তরটির অনুসরণ হিসাবে এটি জিজ্ঞাসা করেন তবে: অ্যাপজিনের সম্পূর্ণ পাঠ্য অনুসন্ধান ফায়ারস্টোর থেকে সম্পূর্ণ আলাদা এবং সুতরাং এটি আপনাকে সরাসরি সাহায্য করবে না। আপনি একটি ক্লাউড ফাংশন ব্যবহার করে আপনার ডেটা প্রতিলিপি করতে পারেন, তবে আউটবোর্ড পূর্ণ পাঠ্য অনুসন্ধানের জন্য পরামর্শটি মূলত এটি। আপনি যদি অন্য কিছু জিজ্ঞাসা করছেন, দয়া করে একটি নতুন প্রশ্ন শুরু করুন।
গিল গিলবার্ট

4
Firestore, আপনি ব্যবহার করার পূর্বে সমস্ত শর্তাবলী সূচক প্রয়োজনwhere
Husam

4
হুসাম যেমন উল্লেখ করেছেন, এই সমস্ত ক্ষেত্রের সূচী করা দরকার। আমি আমার পণ্য নামের যে কোনও শব্দ অনুসন্ধান করতে সক্ষম করেছিলাম। সুতরাং আমি আমার দস্তাবেজে একটি 'অবজেক্ট' টাইপ সম্পত্তি তৈরি করেছি যা কীগুলির সাথে পণ্যের নামের অংশ রয়েছে, প্রত্যেকে তার জন্য নির্ধারিত 'সত্য' মান সহ, যেখানে অনুসন্ধান করা হবে ('नेमসেজমেন্টস.টেনিস', '==', সত্য) কাজ, তবে ফায়ারস্টোর নামের প্রতিটি বিভাগের জন্য একই নামের নামের বিভাগগুলির জন্য একটি সূচক তৈরি করার পরামর্শ দেয়। যেহেতু সীমাহীন সংখ্যক শর্ত থাকতে পারে, এই উত্তরটি কেবলমাত্র খুব সীমাবদ্ধ দৃশ্যের জন্য ব্যবহারযোগ্য যখন তখন সমস্ত অনুসন্ধানের পদগুলি সামনে বর্ণিত হয়।
স্লাওজ

4
@ পেলেগ ক্যোয়ারী কাজ করবে, আপনি এর জন্য একটি সূচক তৈরি করার পরেও আপনার পণ্যের নামটি থাকা প্রতিটি সম্ভাব্য শব্দটির জন্য সূচি তৈরি করা সম্ভব নয়, সুতরাং পণ্যের নামের ক্ষেত্রে পদগুলির সন্ধানের জন্য এই পদ্ধতিরটি আমার ক্ষেত্রে কার্যকর হয়নি।
স্লোজোজ

32

যদিও ফায়ারবেস স্পষ্টভাবে কোনও স্ট্রিংয়ের মধ্যে শব্দটির সন্ধানে সমর্থন করে না,

ফায়ারবেস (এখন) নিম্নলিখিতগুলি সমর্থন করে যা আপনার কেস এবং আরও অনেকের জন্য সমাধান করবে:

আগস্ট 2018 পর্যন্ত তারা array-containsকোয়েরি সমর্থন করে । দেখুন: https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html

আপনি এখন আপনার সমস্ত মূল পদটি একটি ক্ষেত্র হিসাবে অ্যারেতে সেট করতে পারেন তারপরে 'এক্স' থাকা অ্যারে থাকা সমস্ত নথির জন্য কোয়েরি করুন। আপনি অতিরিক্ত প্রশ্নের জন্য আরও তুলনা করতে লজিকাল এবং ব্যবহার করতে পারেন (এটি কারণ ফায়ারবেস বর্তমানে একাধিক অ্যারে -যুক্ত প্রশ্নের জন্য স্থানীয়ভাবে যৌগিক ক্যোয়ারিকে সমর্থন করে না তাই ক্লায়েন্টের শেষে 'এবং' বাছাই করা প্রশ্নগুলি করতে হবে)

এই স্টাইলে অ্যারেগুলি ব্যবহার করে তাদের সমবর্তী লেখাগুলির জন্য অনুকূলিতকরণের সুযোগ দেওয়া হবে যা দুর্দান্ত! পরীক্ষিত হয়নি যে এটি ব্যাচের অনুরোধগুলিকে সমর্থন করে (ডক্স বলবে না) তবে আমি এটির একটি দাপ্তরিক সমাধানের পরে বাজেয়াজ করব।


ব্যবহার:

collection("collectionPath").
    where("searchTermsArray", "array-contains", "term").get()

13
এটি একটি দুর্দান্ত সমাধান। তবে, আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি মনে করি এটি আপনাকে @ টেফেলসেইফ যা বলেছে তা করতে দেয় না। উদাহরণস্বরূপ, আপনি যদি "abc" স্ট্রিংযুক্ত সমস্ত নাম পেতে চান তবে অ্যারে-অন্তর্ভুক্তগুলি নিয়ে আপনি কোনও সাফল্য পাবেন না, কারণ এটি কেবলমাত্র "abc" এর সঠিক নাম থাকা দস্তাবেজগুলি ফিরিয়ে দেবে, তবে "abcD" বা "0abc" আউট হবে।
ইউলিয়ান

4
@ ইউলিয়ান প্রোগ্রামিং জগতে Search termসাধারণত পুরো শব্দটিকে উভয় পক্ষের স্থান, বিরামচিহ্ন ইত্যাদি দ্বারা পৃথক করে বোঝানো হয়। আপনি Google যদি abcdeডান এখন আপনি শুধুমাত্র ভালো জিনিস এর জন্য ফলাফল পাবেন %20abcde.বা ,abcde!কিন্তু abcdefghijk..। যদিও টাইপ করা পুরো বর্ণমালাটি ইন্টারনেটে পাওয়া বেশি দেখা যায়, তল্লাশি আবদ্ধের জন্য নয় * এটি কোনও বিচ্ছিন্ন আবৃত্তিকার জন্য
অ্যালবার্ট রেনশো

4
আমি আপনার বক্তব্যটি দেখছি এবং আমি এটির সাথে একমত হয়েছি, তবে আমি সম্ভবত এই শব্দটি দ্বারা বিভ্রান্ত হয়েছিলাম 'contains', যার অর্থ অনেকগুলি প্রোগ্রামিং ভাষায় আমি ঠিক কী উল্লেখ করছি। এটি '%searchTerm%'একটি এসকিউএল অবস্থান থেকেও যায় ।
ইউলিয়ান

4
@ ইউলিয়ান হ্যাঁ আমি এটি পেয়েছি। ফায়ারবেস নোএসকিউএল যদিও এটি ওয়াইল্ড-কার্ড স্ট্রিং অনুসন্ধানের মতো কিছু অ-সুযোগ-সুবিধার জন্য সীমাবদ্ধ হতে পারে, এমনকি এই ধরণের অপারেশনগুলিকে দ্রুত এবং দক্ষ করে তোলার ক্ষেত্রে এটি সত্যিই ভাল।
অ্যালবার্ট রেনশওয়া

4
ঠিক আছে, আপনি শিরোনামআরয়ের মতো বিভক্ত শব্দের উপস্থাপন করে প্রত্যেকের জন্য একটি পৃথক ক্ষেত্র তৈরি করতে পারেন: ['এই', 'হয়', 'এ', 'শিরোনাম'] প্রতিবার আপনি নথিটি আপডেট করেন update এবং তারপরে অনুসন্ধান শিরোনামের পরিবর্তে সেই ক্ষেত্রের উপর ভিত্তি করে তৈরি করা হবে। আপনি শীতল এই ক্ষেত্রগুলি তৈরি করতে অন-আপডেট একটি ট্রিগার তৈরি করুন। অনুসন্ধান ভিত্তিক পাঠ্যের জন্য প্রচুর কাজ কিন্তু আমার কাছে নোএসকিউএলের পারফরম্যান্সের উন্নতি রয়েছে।
sfratini

16

প্রতি Firestore ডক্স , ক্লাউড Firestore নথি টেক্সট ক্ষেত্রের জন্য অনুসন্ধান নেটিভ ইন্ডেক্স সমর্থন করে না অথবা। অতিরিক্তভাবে, ক্ষেত্রের ক্লায়েন্ট-সাইড অনুসন্ধানের জন্য একটি সম্পূর্ণ সংগ্রহ ডাউনলোড করা কার্যকর নয়।

আলগোলিয়া এবং ইলাস্টিক অনুসন্ধানের মতো তৃতীয় পক্ষের অনুসন্ধান সমাধানগুলি প্রস্তাবিত।


50
আমি দস্তাবেজগুলি পড়েছি, যদিও এটি আদর্শ নয়। ত্রুটিটি হ'ল আলগোলিয়া এবং ফায়ারস্টোরের বিভিন্ন মূল্যের মডেল রয়েছে ... আমি আনন্দের সাথে ফায়ারস্টোরে ,000০০,০০০ নথি রাখতে পারি (যতক্ষণ না আমি প্রতিদিন খুব বেশি জিজ্ঞাসা করি না)। যখন আমি তাদের আলগোলিয়ায় সন্ধান করার জন্য চাপ দিই তখন আমার ফায়ারস্টোর ডকুমেন্টগুলিতে শিরোনাম অনুসন্ধান করতে সক্ষম হবার জন্য আমাকে এখন মাসে মাসে g 310 দিতে হয়।
tehfailsafe

4
সমস্যাটি এটি নিখরচায় নয়
দানি

এটি উত্থাপিত প্রশ্নের সঠিক উত্তর এবং সেরা হিসাবে গ্রহণ করা উচিত।
ব্রিজনদ

14

কয়েকটি নোট এখানে:

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 টি সেট আপ করা সহজ এবং এগুলি বিনামূল্যে স্তর রয়েছে। ডাটা সন্ধান করার জন্য অনক্রিট () এবং অন্য একটি কল () ফাংশন সংরক্ষণ করার জন্য আপনার কাছে একটি ক্লাউড ফাংশন থাকবে। সরল ... ইশ কেন তখন শুধু মাইএসকিউএল এ স্যুইচ করবেন না? রিয়েল-টাইম ডেটা অবশ্যই! যখন কেউ রিয়েল-টাইম ডেটার জন্য ওয়েবগ্রক্সের সাথে ডিজিগ্রাফ লেখেন, তখন আমাকে গণনা করুন!

অ্যালগোলিয়া এবং ইলাস্টিকস অনুসন্ধানগুলি কেবলমাত্র অনুসন্ধানের ডিবিএস হিসাবে নির্মিত হয়েছিল, তাই তাত্পর্য হিসাবে আর কিছুই নেই ... তবে আপনি এটির জন্য অর্থ প্রদান করেন। গুগল, আপনি কেন আমাদের গুগল থেকে দূরে নিয়ে যান, এবং আপনি মঙ্গোডিবি নোএসকিউএল অনুসরণ করেন না এবং অনুসন্ধানগুলি অনুমতি দিচ্ছেন না?

আপডেট - আমি একটি সমাধান তৈরি করেছি:

https://fireblog.io/blog/post/firestore-full-text-search


একটি দুর্দান্ত ওভারভিউ এবং খুব সহায়ক।
রেডফিল্টার

অসাধারণ! একটি সুগঠিত এবং তথ্যমূলক প্রতিক্রিয়ার জন্য উত্সাহ দিন।
জঙ্গলের কিং

12

দেরী উত্তর তবে যে কেউ এখনও উত্তর খুঁজছেন, তাদের জন্য বলুন যে আমাদের ব্যবহারকারীর সংগ্রহ রয়েছে এবং সংগ্রহের প্রতিটি নথিতে আমাদের একটি "ব্যবহারকারীর নাম" ক্ষেত্র রয়েছে, সুতরাং যদি একটি নথির সন্ধান করতে চান যেখানে "আল" দিয়ে ব্যবহারকারীর নাম শুরু হয় আমরা যেমন কিছু করতে পারি

 FirebaseFirestore.getInstance().collection("users").whereGreaterThanOrEqualTo("username", "al")

এটি একটি দুর্দান্ত একটি সহজ সমাধান আপনাকে ধন্যবাদ। তবে যদি আপনি একাধিক ক্ষেত্র চেক করতে চান তবে। একটি নাম দ্বারা সংযুক্ত "নাম" এবং "বিবরণ" এর মতো?
চেষ্টা করুন

আমি মনে করি না আপনি দুটি ক্ষেত্র উপর ভিত্তি করে খোঁজ করতে পারেন, দুঃখিতভাবে firebase খারাপ যখন তা অনুসন্ধান করার আসে, আপনি এই আশা পরীক্ষা করতে পারবেন এটা সাহায্য করে stackoverflow.com/questions/26700924/...
MoTahir

4
নিশ্চিত করেছেন, @ মোতাহির। ফায়ার স্টোরে কোনও "ওআর" নেই।
র‌্যাপ

এই সমাধানটি "আল" দিয়ে শুরু হওয়া ব্যবহারকারীর সাথে মেলে না ... উদাহরণস্বরূপ "হ্যালো" মিলে যাবে ("হ্যালো"> "আল")
এন্টোইন 129

OR দ্বারা জিজ্ঞাসা করা কেবল দুটি অনুসন্ধানের ফলাফলের সংমিশ্রণের বিষয়। এই ফলাফলগুলি বাছাই করা একটি পৃথক সমস্যা ...
জোনাথন

7

আমি নিশ্চিত ফায়ারবেস শীঘ্রই কোনও সূচক ক্যাপচার করার জন্য শীঘ্রই "স্ট্রিং-ইনটেন্ডস" নিয়ে বেরিয়ে আসবে [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()
)

মোটেই প্রস্তাবিত নয়। যেভাবে নথিগুলির 20k লাইনের সীমা রয়েছে, সুতরাং আপনি কেবল এটি এটিকে ব্যবহার করতে পারবেন না যতক্ষণ না আপনি নিশ্চিত হন যে আপনার নথিটি কখনও এইরকম সীমাতে পৌঁছে না
সন্দীপ

এই মুহুর্তে এটি সর্বোত্তম বিকল্প, অন্য কিসের প্রস্তাব দেওয়া হচ্ছে?
নিক কার্ডুচি

4
@ সন্দীপ আমি নিশ্চিত যে মাপটি 1MB আকারের এবং ডকুমেন্টের জন্য 20 স্তরের গভীরতার মধ্যে সীমাবদ্ধ pretty 20k লাইন বলতে কী বোঝ? এটি বর্তমানে ব্যবহার Algolia বা ElasticSearch টেবিল থেকে বের হলে ভাল কার্যসংক্রান্ত নেই
ppicom

6

আপনি যদি অ্যালগোলিয়ার মতো তৃতীয় পক্ষের পরিষেবাটি ব্যবহার করতে না চান তবে ফায়ারবেস ক্লাউড ফাংশনগুলি দুর্দান্ত বিকল্প। আপনি একটি ফাংশন তৈরি করতে পারেন যা একটি ইনপুট প্যারামিটার গ্রহণ করতে পারে, রেকর্ড সার্ভার-সাইডের মাধ্যমে প্রক্রিয়া করতে পারে এবং তারপরে আপনার মানদণ্ডের সাথে মেলে এমনগুলি ফিরিয়ে দেয়।


4
অ্যান্ড্রয়েড সম্পর্কে কি?
প্রতীক বুটানি

আপনি কি প্রস্তাব দিচ্ছেন যে লোকেরা সংগ্রহের প্রতিটি একক রেকর্ডে পুনরাবৃত্তি করে?
ডার্কনিউরন

আসলে তা না. আমি অ্যারে.প্রোটোটাইপ ব্যবহার করতাম * * - .every (), .some (), .map (), .filter () ইত্যাদি ইত্যাদি এটি সার্ভারের ফায়ারবেস ফাংশনে নোডে মানগুলি ফেরত দেওয়ার আগে করা হয় the ক্লায়েন্ট
র‌্যাপ

4
আপনাকে অনুসন্ধানের জন্য সমস্ত দস্তাবেজ এখনও পড়তে হবে, যা ব্যয় বহন করে এবং সময়ের জন্য ব্যয়বহুল।
জোনাথন

4

নির্বাচিত উত্তরটি কেবল সঠিক অনুসন্ধানগুলির জন্য কাজ করে এবং এটি প্রাকৃতিক ব্যবহারকারীর অনুসন্ধানের আচরণ নয় ("জো আজ একটি অ্যাপল খেয়েছে" "আপেল" অনুসন্ধান করা কাজ করবে না)।

আমি মনে করি উপরের ড্যান ফিনের উত্তরটি উচ্চতর হওয়া উচিত। আপনি যে স্ট্রিং ডেটাটি অনুসন্ধান করছেন তা যদি সংক্ষিপ্ত হয়, আপনি স্ট্রিংয়ের সমস্ত সাবস্ট্রিংগুলি আপনার নথির একটি অ্যারেতে সংরক্ষণ করতে পারেন এবং তারপরে ফায়ারবেসের অ্যারে_সামগ্রী কোয়েরি দিয়ে অ্যারের মাধ্যমে অনুসন্ধান করতে পারেন। ফায়ারবেস ডকুমেন্টস 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....

3

আমি এই সমস্যাটি পেয়েছি এবং একটি খুব সহজ সমাধান নিয়ে এসেছি।

String search = "ca";
Firestore.instance.collection("categories").orderBy("name").where("name",isGreaterThanOrEqualTo: search).where("name",isLessThanOrEqualTo: search+"z")

IsGreaterThanOrEqualTo আমাদের অনুসন্ধানের শুরুটি ফিল্টার আউট করতে দেয় এবং isLessThanOrEqualT এর শেষে একটি "z" যুক্ত করে আমরা আমাদের অনুসন্ধানটি পরবর্তী নথিগুলিতে রোল না করার জন্য ক্যাপ করি।


4
Ive এই সমাধানটি চেষ্টা করেছিলাম তবে আমার জন্য এটি কেবল তখনই কাজ করে যখন সম্পূর্ণ স্ট্রিং প্রবেশ করানো হয়। উদাহরণস্বরূপ, যদি আমি "ফ্রি" শব্দটি পেতে চাই, আমি "ফরাসী" টাইপ করা শুরু করলে কিছুই ফিরে আসবে না। আমি একবার "ফ্রি" টাইপ করলে শব্দটি আমাকে তার স্ন্যাপশট দেয়।
ক্রিস

আপনি কি একই কোড ফর্ম্যাট ব্যবহার করছেন? এবং শব্দটি কি আগুনের দোকানে স্ট্রিং? আমি জানি যে আপনি ডকুমেন্টআইডি দ্বারা ফিল্টার করতে পারবেন না।
জ্যাকব বনক

3

আমি আসলে ফায়ারস্টোরের মধ্যে এটি করার সর্বোত্তম সমাধানটি হ'ল সমস্ত সাবস্ট্রিংগুলিকে একটি অ্যারেতে রাখা এবং কেবল একটি অ্যারে_সামগ্রী অনুসন্ধান করা। এটি আপনাকে সাবস্ট্রিং ম্যাচিং করতে দেয়। সমস্ত সাবস্ট্রিংগুলি সঞ্চয় করার জন্য কিছুটা ওভারকিল তবে আপনার অনুসন্ধানের পদগুলি যদি ছোট হয় তবে এটি খুব যুক্তিসঙ্গত।


0

ফায়ারস্টোরের সাহায্যে আপনি একটি সম্পূর্ণ পাঠ্য অনুসন্ধান কার্যকর করতে পারেন তবে এটি অন্যথায় পড়ার চেয়ে আরও বেশি পড়তে পারে এবং আপনাকে একটি নির্দিষ্ট উপায়ে ডেটা প্রবেশ ও সূচীকরণ করতে হবে, সুতরাং এই পদ্ধতির মাধ্যমে আপনি ফায়ারবেস ক্লাউড ফাংশনগুলি ব্যবহার করতে পারেন টোকেনাইজ এবং তারপরে আপনার ইনপুট পাঠ্যটি হ্যাশ করুন যখন লিনিয়ার হ্যাশ ফাংশনটি বেছে নিন h(x)যা নিম্নলিখিতগুলিকে সন্তুষ্ট করে - যদি x < y < z then h(x) < h (y) < h(z)। টোকেনাইজেশনের জন্য আপনি আপনার ফাংশনের শীতল শুরুর সময় কম রাখার জন্য কিছু হালকা এনএলপি লাইব্রেরি বেছে নিতে পারেন যা আপনার বাক্য থেকে অপ্রয়োজনীয় শব্দগুলি ছড়িয়ে দিতে পারে। তারপরে আপনি ফায়ার স্টোরে অপারেটরের চেয়ে কম এবং এর চেয়ে বেশি দিয়ে একটি ক্যোয়ারী চালাতে পারেন। আপনার ডেটা সংরক্ষণ করার সময়, আপনাকে অবশ্যই এটি সংরক্ষণ করতে হবে তা নিশ্চিত করে নিতে হবে এবং আপনি সরল পাঠ্যটি সংরক্ষণ করে রাখবেন যেন আপনি সরল পাঠ্য পরিবর্তন করেন তবে হ্যাশ মানটিও পরিবর্তিত হবে।


0

এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে তবে পারফরম্যান্স সমস্যার কারণ হতে পারে।

অগ্নিকান্ডার অনুসন্ধানের সময় এটি করুন:

   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);
            })
   };

0

আজকের হিসাবে, মূলত 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 পদ্ধতি-বি এর অনুরূপ, এই পদ্ধতিটির জন্য প্রত্যেক সময় ডেটা ডিবিতে সংরক্ষণ করার সময় অতিরিক্ত প্রক্রিয়াজাতকরণ প্রয়োজন, এবং আরও গুরুত্বপূর্ণ, অনুসন্ধান স্ট্রিংগুলির অ্যারে সঞ্চয় করতে অতিরিক্ত স্থান প্রয়োজন।

সি .২ ফায়ারস্টোর ক্যোয়ারিতে যৌগিক ক্যোয়ারিতে সর্বাধিক একটি "অ্যারে-অন্তর্ভুক্ত" বা "অ্যারে-অন্তর্ভুক্ত-যে কোনও" ধারা অন্তর্ভুক্ত থাকতে পারে।

সাধারণ সীমাবদ্ধতা:

  1. এই সমাধানগুলির কোনওটিই আংশিক স্ট্রিংগুলির অনুসন্ধানে সমর্থন করে বলে মনে হচ্ছে না। উদাহরণস্বরূপ, যদি কোনও ডিবি ক্ষেত্রে "1 পিটার সেন্ট, গ্রিন জেলা" থাকে তবে আপনি স্ট্রিংটির জন্য "কঠোর" অনুসন্ধান করতে পারবেন না।
  2. প্রত্যাশিত অনুসন্ধান স্ট্রিংগুলির সমস্ত সম্ভাব্য সংমিশ্রণগুলি কভার করা প্রায় অসম্ভব। উদাহরণস্বরূপ, যদি কোনও ডিবি ক্ষেত্রে "1 মোহাম্মদ সেন্ট, গ্রিন জেলা" থাকে তবে আপনি "গ্রিন মোহাম্মদ" স্ট্রিংটি অনুসন্ধান করতে পারবেন না, এটি একটি স্ট্রিং যা শব্দটি ডিবিতে ব্যবহৃত ক্রমের চেয়ে আলাদা ক্রমে শব্দযুক্ত রয়েছে is ক্ষেত্র

এমন কোনও সমাধান নেই যা সমস্ত মানায়। প্রতিটি workaround এর সীমাবদ্ধতা আছে। আমি আশা করি উপরের তথ্যগুলি এই কাজের ক্ষেত্রগুলির মধ্যে বাছাই প্রক্রিয়া চলাকালীন আপনাকে সহায়তা করতে পারে।

ফায়ারস্টোর ক্যোয়ারী শর্তগুলির তালিকার জন্য, দয়া করে ডকুমেন্টেশনটি https://firebase.google.com/docs/firestore/query-data/queries দেখুন

আমি https://fireblog.io/blog/post/firestore-full-text-search চেষ্টা করিনি , যা @ জোনাথন প্রস্তাবিত।


-10

স্ট্রিংয়ের মান মুদ্রণ করতে আমরা ব্যাক-টিক ব্যবহার করতে পারি। এই কাজ করা উচিত:

where('name', '==', `${searchTerm}`)

ধন্যবাদ, তবে এই প্রশ্নটি হুবহু মান পাওয়ার বিষয়ে। উদাহরণস্বরূপ, প্রশ্নের উদাহরণটি নামটি সঠিক কিনা তা কাজ করে। যদি নাম সহ ডক থাকে: "টেস্ট" এবং তারপরে আমি "টেস্ট" অনুসন্ধান করি, এটি কার্যকর হয়। তবে আমি "টেস" বা "ইস্ট" অনুসন্ধান করতে সক্ষম হতে এবং এখনও "টেস্ট" ফলাফল পেতে আশা করব। বইয়ের শিরোনাম সহ কোনও ব্যবহারের ক্ষেত্রে কল্পনা করুন। সম্পূর্ণরূপে সুনির্দিষ্ট শিরোনামের চেয়ে লোকেরা প্রায়শই আংশিক বইয়ের শিরোনাম অনুসন্ধান করে।
tehfailsafe

14
@ সুউলিসিন আপনি ঠিক বলেছেন, আমি যা পেয়েছি তা ভাগ করে নেওয়ার জন্য আগ্রহী হওয়ায় আমি তা মনোযোগ দিয়ে পড়িনি। এটি উল্লেখ করার জন্য আপনার প্রচেষ্টার জন্য আপনাকে ধন্যবাদ এবং আমি আরও সতর্ক থাকব
জ্যাচ জে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.