Veritabanı vurgulama Ara Dönem ve Sonuç kucultuluyor

1 Cevap php

Şu anda bir veritabanında benim "sayfalar" üzerinde bir tam metin arama yapıyorum. Kullanıcıların istedikleri sonuçları elde ederken, ben dünyanın geldi sonuçlar geldi neden olarak ilgili bilgileri onlara veremiyoruz.

Ben arıyorum ne Özellikler:

  1. Ben böyle "test" ve içerdiği çıkan sayfada bir dönem için arama yaparsanız, <b>here is some test</b> page, yani HTML Veri var. Ben olumsuz sayfada html kodu etkilemeden terimini vurgulamak gerekir.
  2. Ben sadece google yaptığı gibi, belgenin bir kısmını iade etmek istiyorum; döndürülen kısmı benim arama terimleri iyi bir kısmını içermesi durumunda. Nasıl en terimleri içeren bölümü belirleyebilirsiniz? Hangi bölüm genel olarak en terimleri döndürür, veya tek tek arama terimlerinin çoğu vardır bölümü, ya da her ikisinin kombinasyonu belirlemek için iyi olurdu? Veya birden çok bilgi snipits dahil edilmelidir?
  3. Ben bu uygulanabilir bir seçenek ise, bu sunucu tarafı yapmak istiyorsunuz?

Ben bu iki şeyi yapmayı gidiş iyi yolu ne olduğu konusunda emin değilim. Ben dikkate alınması gereken kolayca göz ardı edilebilir bir sorunu biliyor musunuz:

a. Eğer dikkatli değilseniz rastgele noktalarda html veri kapalı Snipping tamamen örneğin, bir div etiketi kapanış değil off benim bütün düzeni atabilir, sayfa berbat edebilir. Bu çevrede en iyi çözümler nelerdir?

Yukarıdaki gibi bir arama sistemi elde etmek için en iyi yöntemler nelerdir?

1 Cevap

  1. Ben arama sonuçlarında HTML biçimlendirme tutmak olmaz. Bu sonuçlar sayfanız çok dağınık olur. Sadece kesik içeriği kısa alıntı baskı için gidiyoruz özellikle - Başlıklar, satır araları görüntüleri, sonuç açıklamaları vb paragraf marjları, dahil etmek mantıklı değil.
  2. Ben, çoğu durumda sadece bir kez iki kez tekrarlanır arama terimleri% 50 eşleşen bir sonuç daha önemli olacak arama terimleri% 100 uyan bir sonuç düşünüyorum. Ama bu aynı zamanda sorgu bağlıdır.
  3. Eğer seferde müşteriye sonuç tüm sayfaları göndermek istediğiniz sürece, tek uygun seçenek.

Kullandığınız yana MySQL'in yerleşik tam arama fonksiyonu, gerçekten kullanıcıyı why sonuçlar onlar ne olduğunu göstermek değil - değil tam arama alaka belirler nasıl ayrıntılı bir anlayış olmadan. Ne yapabilirim kendi arama ile ilgili olabilir ve onları içine bakmak için hangi sonuçları yararlı tespitler yapmak yardımcı olabilir her sayfasından kullanıcı alıntılar göstermek olduğunu.

Ben ilk bireysel cümlelerden bir diziye explode() içerik sonra, strip_tags() kullanarak herhangi bir biçimlendirme sayfa içeriği şerit olacak. Sonra her cümlenin doğruluğunu belirlemek için dizi yineleme olabilir ve o zaman sadece kullanıcıya en uygun cümle (ler) görüntüler. En uygun cümle çok uzun ise, o sözcük sınırları onu kesecek.

$text = strip_slashes($content);
$sentences = explode('.  ', $text);
$relevance = array();
foreach ($sentences as $i=>$sentence) {
    $rel = 0;
    $relevance[$i] = calcRel($sentence);
}
arsort($relevance);
list($i, $j) = array_keys($relevance);
$ellips = (abs($i-$j)>1?'...':'');
if ($i < $j) {
    $description = $sentences[i].$ellips.$sentences[j];
} else {
    $description = $sentences[j].$ellips.$sentences[i];
}

calcRel($sentence) ile hesaplanan alaka gösteren sayısal bir değer döndürür:

  1. $sentence tüm sorgu dizesi aranıyor. Her bir oluşum için, alaka sayı 2 ^ n artmış olacaktı; n sorgu dizesinde kelime sayısıdır.
  2. Kısmi eşleşmeler için ara - yine ^ n 2 ile ağırlıklı; n eşleşen sözcüklerin sayısı olmak.
  3. Her vererek, tek tek sorgu sözcükleri aramak 1 bir kilo maç.
  4. Son olarak, yukarıdaki her bir arama olarak, uygun kelime / ifadeler $sentence çıkarılmalıdır böylece eğer bir kereden fazla sayılmaz.

Alternatif bir strateji, sadece her maçın konumunu kayıt, arama terimleri için tüm metin taramak için olabilir. Sonra basit aritmetik kullanarak, arama anahtar kelime dar küme bulmak ve alıntı bu şekilde seçmek, kelime sınırları veya cümle sınırları kesiliyor olabilir.