ਫਿਲਟਰ ਐਕਸਟ੍ਰੈਕਸ਼ਨ: ਰੈਗੇਕਸ ਸ਼ਬਦ ਸੀਮਾ ਮੈਚਿੰਗ

ਇਹ ਲੇਖ ਦੱਸਦਾ ਹੈ ਕਿ ਅਸੀਂ ਕਿਵੇਂ ਸ਼ਬਦ ਸੀਮਾ ਰੈਗੇਕਸ ਮੈਚਿੰਗ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੁਦਰਤੀ ਭਾਸ਼ਾ ਦੀਆਂ ਖੋਜ ਕੁਵੈਰੀਆਂ ਤੋਂ ਵਾਕੰਸ਼-ਤੋਂ-ਫਿਲਟਰ ਮੈਪਿੰਗਾਂ ਦੇ ਖਿਲਾਫ ਬਣੀਆਂ ਫਿਲਟਰਾਂ ਕੱਢਦੇ ਹਾਂ।

ਸਮੱਸਿਆ: ਕੁਦਰਤੀ ਭਾਸ਼ਾ ਤੋਂ ਬਣੀਆਂ ਫਿਲਟਰਾਂ ਤੱਕ

ਜਦੋਂ ਇੱਕ ਵਰਤੋਂਕਾਰ "16gb ਰੈਮ ਵਾਲਾ ਮਿੰਨੀ ਪੀਸੀ" ਲਈ ਖੋਜਦਾ ਹੈ, ਤਾਂ ਸਾਨੂੰ ਕੱਢਣ ਦੀ ਲੋੜ ਹੈ:

{
  "Form Factor": "Mini PC",
  "Main Memory": "16"
}

ਇਹ ਬਣੀਆਂ ਫਿਲਟਰਾਂ ਸਮਰੱਥ ਬਣਾਉਂਦੀਆਂ ਹਨ:

  • ਉਤਪਾਦ ਫਿਲਟਰਿੰਗ: ਸਿਰਫ਼ ਮੇਲ ਖਾਂਦੇ ਉਤਪਾਦ ਦਿਖਾਓ

  • ਫੇਸਟਡ ਨੈਵੀਗੇਸ਼ਨ: ਉਪਲਬਧ ਫਿਲਟਰ ਵਿਕਲਪ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ

  • ਕੁਵੈਰੀ ਪੰਨਾ ਜਨਰੇਸ਼ਨ: ਐਸਈਓ-ਅਨੁਕੂਲਿਤ ਪੰਨੇ ਬਣਾਓ

  • ਸੰਬੰਧਿਤ ਖੋਜਾਂ: ਸਮਾਨ ਕੁਵੈਰੀਆਂ ਲੱਭੋ

ਚੁਣੌਤੀ ਇਹ ਹੈ ਕਿ ਵਰਤੋਂਕਾਰ ਇੱਕੋ ਇਰਾਦਾ ਦਰਸਾਉਣ ਦੇ ਸਾਰੇ ਤਰੀਕਿਆਂ ਨੂੰ ਸੰਭਾਲਣਾ।

ਐਲਗੋਰਿਦਮ: ਸ਼ਬਦ ਸੀਮਾ ਰੈਗੇਕਸ ਮੈਚਿੰਗ

ਪਗ 1: ਵਾਕੰਸ਼ ਮੈਪਿੰਗਾਂ ਲੋਡ ਕਰੋ

ਅਸੀਂ ਐਸਈਓ ਪਾਈਪਲਾਈਨ ਦੁਆਰਾ ਤਿਆਰ ਕੀਤੀਆਂ ਵਾਕੰਸ਼-ਤੋਂ-ਫਿਲਟਰ ਮੈਪਿੰਗਾਂ ਲੋਡ ਕਰਦੇ ਹਾਂ। ਇਹ ਮੈਪਿੰਗਾਂ ਵਾਕੰਸ਼ਾਂ ਨੂੰ ਫਿਲਟਰ ਮੁੱਲਾਂ ਨਾਲ ਜੋੜਦੀਆਂ ਹਨ, ਜਿਸ ਨਾਲ ਵਾਕੰਸ਼ ਤੋਂ ਸੰਬੰਧਿਤ ਫਿਲਟਰ ਕੁੰਜੀ ਅਤੇ ਮੁੱਲ ਦੀ ਖੋਜ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲਦੀ ਹੈ।

ਅਸੀਂ ਤੇਜ਼ ਖੋਜ ਲਈ ਇਸ ਬਣਤਰ ਨੂੰ ਉਲਟਾ ਦਿੰਦੇ ਹਾਂ, ਤਾਂ ਕਿ ਅਸੀਂ ਫਿਲਟਰ ਦੀ ਬਜਾਏ ਵਾਕੰਸ਼ ਦੁਆਰਾ ਖੋਜ ਕਰ ਸਕੀਏ:

phrase_to_filter = {
    "16gb ram": ("Main Memory", "16"),
    "16 gb ram": ("Main Memory", "16"),
    "mini pc": ("Form Factor", "Mini PC"),
    "mini computer": ("Form Factor", "Mini PC")
}

ਪਗ 2: ਕੁਵੈਰੀ ਨੂੰ ਨਾਰਮਲਾਈਜ਼ ਕਰੋ

ਕੇਸ-ਅਸੰਵੇਦੀ ਮੈਚਿੰਗ ਲਈ ਕੁਵੈਰੀ ਨੂੰ ਛੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਬਦਲੋ।

ਪਗ 3: ਸ਼ਬਦ ਸੀਮਾਵਾਂ ਨਾਲ ਵਾਕੰਸ਼ ਮਿਲਾਓ

ਮੈਪਿੰਗਾਂ ਵਿੱਚ ਹਰੇਕ ਵਾਕੰਸ਼ ਲਈ, ਅਸੀਂ ਨਿਯਮਿਤ ਸਮੀਕਰਨਾਂ ਵਿੱਚ ਸ਼ਬਦ ਸੀਮਾ ਐਂਕਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਜਾਂਚ ਕਰਦੇ ਹਾਂ ਕਿ ਕੀ ਇਹ ਕੁਵੈਰੀ ਵਿੱਚ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ।

\b ਐਂਕਰਾਂ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹਨ ਕਿ ਅਸੀਂ ਪੂਰੇ ਸ਼ਬਦ ਮਿਲਾਉਂਦੇ ਹਾਂ, ਉਪਸ਼ਬਦ ਨਹੀਂ: "mini pc" "mini pc with ram" ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ ਪਰ "minipc" (ਸਪੇਸ ਨਹੀਂ) ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦਾ, ਅਤੇ "16gb" "16gb ram" ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ ਪਰ "216gb" (ਅਧੂਰਾ ਮੈਚ) ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦਾ।

ਪਗ 4: ਸਾਰੇ ਮੈਚ ਇਕੱਠੇ ਕਰੋ

ਅਸੀਂ ਸਾਰੇ ਵਾਕੰਸ਼ਾਂ ਵਿੱਚੋਂ ਲੰਘਦੇ ਹਾਂ ਅਤੇ ਮੇਲ ਖਾਂਦੀਆਂ ਫਿਲਟਰਾਂ ਇਕੱਠੀਆਂ ਕਰਦੇ ਹਾਂ। "mini pc with 16gb ram" ਲਈ, ਇਹ {"Form Factor": "Mini PC", "Main Memory": "16"} ਵਰਗੀਆਂ ਫਿਲਟਰਾਂ ਪੈਦਾ ਕਰਦਾ ਹੈ।

ਸ਼ਬਦ ਸੀਮਾਵਾਂ ਕਿਉਂ?

ਸ਼ਬਦ ਸੀਮਾਵਾਂ ਝੂਠੇ ਮੈਚਾਂ ਨੂੰ ਰੋਕਦੀਆਂ ਹਨ:

ਸ਼ਬਦ ਸੀਮਾਵਾਂ ਤੋਂ ਬਿਨਾਂ:

  • "i5" "i5000" ਨਾਲ ਮੇਲ ਖਾਂਦਾ (ਗਲਤ)

  • "ram" "program" ਨਾਲ ਮੇਲ ਖਾਂਦਾ (ਗਲਤ)

  • "pc" "pcie" ਨਾਲ ਮੇਲ ਖਾਂਦਾ (ਗਲਤ)

ਸ਼ਬਦ ਸੀਮਾਵਾਂ ਨਾਲ: "i5" "i5 processor" ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ ✅ ਪਰ "i5000" ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦਾ ❌; "ram" "16gb ram" ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ ✅ ਪਰ "program" ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦਾ ❌। \b ਐਂਕਰ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਅਸੀਂ ਸਿਰਫ਼ ਸ਼ਬਦ ਦੇ ਕਿਨਾਰਿਆਂ 'ਤੇ ਮੇਲ ਖਾਂਦੇ ਹਾਂ।

ਮਲਟੀਪਲ ਮੈਚਾਂ ਨੂੰ ਸੰਭਾਲਣਾ

ਜੇ ਇੱਕੋ ਫਿਲਟਰ ਲਈ ਕਈ ਵਾਕੰਸ਼ ਮੇਲ ਖਾਂਦੇ ਹਨ, ਤਾਂ ਆਖਰੀ ਮੈਚ ਜਿੱਤਦਾ ਹੈ:

# ਕੁਵੈਰੀ: "mini pc small computer"
# "mini pc" ਅਤੇ "small computer" ਦੋਵੇਂ "Form Factor:Mini PC" ਨੂੰ ਮੈਪ ਕਰਦੇ ਹਨ
# ਨਤੀਜਾ: {"Form Factor": "Mini PC"} (ਡੂਪਲੀਕੇਟ ਹਟਾਇਆ ਗਿਆ)

ਜੇ ਇੱਕੋ ਫਿਲਟਰ ਲਈ ਵੱਖ-ਵੱਖ ਮੁੱਲਾਂ ਵਾਲੇ ਕਈ ਵਾਕੰਸ਼ ਮੇਲ ਖਾਂਦੇ ਹਨ, ਤਾਂ ਆਖਰੀ ਮੈਚ ਜਿੱਤਦਾ ਹੈ:

# ਕੁਵੈਰੀ: "8gb 16gb ram"
# "8gb" → Main Memory:8
# "16gb" → Main Memory:16
# ਨਤੀਜਾ: {"Main Memory": "16"} (ਆਖਰੀ ਮੈਚ ਜਿੱਤਦਾ ਹੈ)

ਅਸਲ ਵਿੱਚ, ਵਰਤੋਂਕਾਰ ਘੱਟ ਹੀ ਵਿਰੋਧੀ ਮੁੱਲ ਨਿਰਧਾਰਿਤ ਕਰਦੇ ਹਨ, ਇਸਲਈ ਇਹ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ।

ਵਾਕੰਸ਼ ਤਰਜੀਹ

ਵਾਕੰਸ਼ਾਂ ਨੂੰ ਮੈਪਿੰਗਾਂ ਵਿੱਚ ਉਨ੍ਹਾਂ ਦੇ ਦਿਖਾਈ ਦੇਣ ਦੇ ਕ੍ਰਮ ਵਿੱਚ ਮਿਲਾਇਆ ਜਾਂਦਾ ਹੈ। ਕਿਉਂਕਿ ਮੈਪਿੰਗਾਂ ਸਮਰੂਪਤਾ (ਸਭ ਤੋਂ ਉੱਚਾ ਪਹਿਲਾਂ) ਅਤੇ ਫਿਰ ਲੰਬਾਈ (ਸਭ ਤੋਂ ਛੋਟਾ ਪਹਿਲਾਂ) ਦੁਆਰਾ ਕ੍ਰਮਬੱਧ ਹੁੰਦੀਆਂ ਹਨ, ਉੱਚ-ਗੁਣਵੱਤਾ ਵਾਲੇ ਮੈਚਾਂ ਦੀ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਹਾਲਾਂਕਿ, ਕਿਉਂਕਿ ਅਸੀਂ ਸਾਰੇ ਵਾਕੰਸ਼ਾਂ ਵਿੱਚੋਂ ਲੰਘਦੇ ਹਾਂ, ਕ੍ਰਮ ਅੰਤਿਮ ਨਤੀਜੇ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਕਰਦਾ—ਆਖਰੀ ਮੈਚ ਜਿੱਤਦਾ ਹੈ।

ਪ੍ਰਦਰਸ਼ਨ ਆਪਟੀਮਾਈਜ਼ੇਸ਼ਨ

ਕੈਸ਼ਿੰਗ

ਵਾਕੰਸ਼-ਤੋਂ-ਫਿਲਟਰ ਮੈਪਿੰਗ ਸ਼ੁਰੂਆਤ 'ਤੇ ਇੱਕ ਵਾਰ ਲੋਡ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਅਤੇ ਮੈਮੋਰੀ ਵਿੱਚ ਕੈਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਹਰ ਬੇਨਤੀ 'ਤੇ ਦੁਹਰਾਏ ਜਾਣ ਵਾਲੇ ਡਿਸਕ I/O ਤੋਂ ਬਚਿਆ ਜਾ ਸਕਦਾ ਹੈ।

ਵਾਲਕੀ ਫਾਲਬੈਕ

ਅਸੀਂ ਪਹਿਲਾਂ Valkey (Redis ਫੋਰਕ) ਤੋਂ ਮੈਪਿੰਗਾਂ ਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ, ਜੇਕਰ Valkey ਮਿਸ ਹੋਵੇ ਤਾਂ JSON ਫਾਈਲਾਂ ਤੋਂ ਲੋਡ ਕਰਦੇ ਹਾਂ:

  1. ਤੇਜ਼ ਮੈਮੋਰੀ-ਅੰਦਰ ਖੋਜ ਲਈ Valkey ਦੀ ਜਾਂਚ ਕਰੋ
  2. ਜੇਕਰ Valkey ਮਿਸ ਹੋਵੇ ਤਾਂ JSON ਤੋਂ ਲੋਡ ਕਰੋ
  3. ਕੈਸ਼ ਐਕਸਪਾਇਰੇਸ਼ਨ ਨਾਲ Valkey ਵਿੱਚ ਸਟੋਰ ਕਰੋ

ਇਹ ਬਾਅਦ ਦੀਆਂ ਬੇਨਤੀਆਂ ਲਈ ਵਿਲੰਬਤਾ ਨੂੰ ਘਟਾਉਂਦਾ ਹੈ।

ਰੈਗੇਕਸ ਮੈਚਿੰਗ

ਪੈਟਰਨ ਝੂਠੇ ਅਧੂਰੇ ਮੈਚਾਂ ਤੋਂ ਬਿਨਾਂ ਪੂਰੇ ਸ਼ਬਦਾਂ ਨੂੰ ਕੁਸ਼ਲਤਾ ਨਾਲ ਮਿਲਾਉਣ ਲਈ ਸ਼ਬਦ ਸੀਮਾ ਐਂਕਰਾਂ ਨਾਲ re.search() ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ।

ਖੋਜ ਸੇਵਾ ਨਾਲ ਏਕੀਕਰਨ

ਫਿਲਟਰ ਐਕਸਟ੍ਰੈਕਸ਼ਨ ਨੂੰ ਇੱਕ API ਸੇਵਾ ਐਂਡਪੁਆਇੰਟ ਵਜੋਂ ਲਾਗੂ ਕੀਤਾ ਗਿਆ ਹੈ ਜੋ ਖੋਜ ਕੁਵੈਰੀਆਂ ਨੂੰ ਸਵੀਕਾਰ ਕਰਦਾ ਹੈ ਅਤੇ ਕੱਢੀਆਂ ਗਈਆਂ ਫਿਲਟਰਾਂ ਵਾਪਸ ਕਰਦਾ ਹੈ।

ਸੇਵਾ:

  1. ਇਨਪੁਟ ਵਜੋਂ ਇੱਕ ਖੋਜ ਕੁਵੈਰੀ ਸਵੀਕਾਰ ਕਰਦੀ ਹੈ
  2. ਵਾਕੰਸ਼-ਤੋਂ-ਫਿਲਟਰ ਮੈਪਿੰਗਾਂ ਨੂੰ ਮੈਮੋਰੀ ਵਿੱਚ ਲੋਡ ਕਰਦੀ ਹੈ
  3. ਸ਼ਬਦ ਸੀਮਾਵਾਂ ਨਾਲ ਵਾਕੰਸ਼ਾਂ ਨੂੰ ਨਾਰਮਲਾਈਜ਼ ਅਤੇ ਮਿਲਾਉਂਦੀ ਹੈ
  4. ਬਣੀਆਂ ਫਿਲਟਰ ਕੁੰਜੀ-ਮੁੱਲ ਜੋੜੇ ਵਾਪਸ ਕਰਦੀ ਹੈ

ਮੁੱਖ ਵੈਬ ਸਰਵਰ ਫਿਲਟਰਾਂ ਨੂੰ ਵਰਤੋਂਕਾਰ ਕੁਵੈਰੀਆਂ ਤੋਂ ਕੱਢਣ ਲਈ ਇਸ ਸੇਵਾ ਨੂੰ ਕਾਲ ਕਰਦਾ ਹੈ:

filters = extract_filters_from_query("mini pc 16gb ram")
# ਵਾਪਸੀ: {"Form Factor": "Mini PC", "Main Memory": "16"}

ਚਿੰਤਾਵਾਂ ਦਾ ਇਹ ਵੱਖਰਾ ਹੋਣਾ ਸਮਰੱਥ ਬਣਾਉਂਦਾ ਹੈ:

  • ਸੁਤੰਤਰ ਸਕੇਲਿੰਗ: ਫਿਲਟਰ ਐਕਸਟ੍ਰੈਕਸ਼ਨ ਇੱਕ ਵੱਖਰੇ ਸਰਵਰ 'ਤੇ ਚੱਲ ਸਕਦੀ ਹੈ

  • ਕੈਸ਼ਿੰਗ ਆਈਸੋਲੇਸ਼ਨ: ਸੇਵਾ ਆਪਣੀ ਖੁਦ ਦੀ ਮੈਪਿੰਗ ਕੈਸ਼ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦੀ ਹੈ

  • ਸੇਵਾ ਰੀਸਟਾਰਟ: ਸੇਵਾ ਨੂੰ ਮੁੱਖ ਵੈਬ ਸਰਵਰ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕੀਤੇ ਬਿਨਾਂ ਸੁਤੰਤਰ