ugrás a tartalomhoz

Index Server elérése PHP-ból

Phaidrosz · 2011. Aug. 2. (K), 14.13
Egy file share-en fájlok vannak tárolva, amire be is van állítva az indexelés. Ezek tartalmában szeretnék keresni az index server segítségével php-ból.
A kérdésem az volna, hogy milyen lehetőségeim vannak elérni a windows indexing service-ét php-ból.
Eddig amire bukkantam, de még nem igazán tiszta a kép:
vagy ole-db segítségével,
vagy COM(ixsso.Query) objektummal.
Utóbbi azért problémás mert elvileg csak a php win32-es verziójának futtatásakor érhető el és a php szerver 64bites. Valaki találkozott-e már működő megoldással? Aki hasonlót használt is jó lenne valami konkrét példa. Van más megoldás is, vagy csak a fent említettek?
A válaszokat előre is köszönöm.
 
1

Próba

Poetro · 2011. Aug. 2. (K), 15.09
Mivel nálam nem fut az Indexing Service, így érdemben nem tudtam futtatni, de valami ilyesmi:
<?php
$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
$conn->Open('Provider=MSIDXS');
$results = $conn->Execute('Select Filename from Scope()');
De kippróbáltam Windows Search-csel, és nagyszerű eredményeket kapok:
<?php
$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=Search.CollatorDSO;EXTENDED PROPERTIES='Application=Windows';");
$recordset = new COM('ADODB.Recordset');
$recordset->Open('SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX', $conn);
while (!$recordset->EOF) {
  echo $recordset->Fields->Item("System.ItemPathDisplay")->Value, "\n";
  $recordset->MoveNext();
}
Amit még fontos tudni, hogy a függvények és a tulajdonságok a VBScript interfaceben előforduló neveket használják
2

Próba

Phaidrosz · 2011. Aug. 3. (Sze), 14.48
Köszönöm a segítséget, működik. Kiderült, hogy nem is az index server hanem a windows search service volt felrakva.
3

A lekérdezhető filed-ek nevei

Phaidrosz · 2011. Aug. 4. (Cs), 09.54
Olyan kérdésem lenne még ezzel kapcsolatban, ugyanis ADO-ban nem igazán vagyok otthon, hogy miként tudom lekérdezni azt, hogy milyen mezői vannak az indextáblának?
4

MSDN

Poetro · 2011. Aug. 4. (Cs), 10.29
Az MSDN eléggé részletes az Windows Search-csel kapcsolatban, érdemes azt nézegetni.

Azt hozzátenném, hogy én a fenti eset előtt soha nem használtam COM-ot, ADO-t, VBScript-et, nem láttam még, hogyan működik a Windows Search. Ha nekem sikerül pár perc alatt a fentit kideríteni, neked se lesz nehéz.
5

A találat X karakternyi szövegkörnyezetének megjelenítése

Phaidrosz · 2011. Aug. 11. (Cs), 12.38
Hali!
Az volna még a kérdésem, hogy van-e arra opció, hogy a keresés eredményében megjelenítsem a találat szövegkörnyezetét, mint pl a google- kereséseknél is. Sajnos erre nem találtam leírást. Esetleg akinek van erre valamiféle public megoldása megköszönném.
6

Megoldás

Phaidrosz · 2011. Aug. 11. (Cs), 16.01
Bár válasz nem érkezett, viszont sikerült megoldani a dolgot. Viszont csak az első találat körüli szöveget íratom még ki az alábbi kód segítségével:
...
<form name="searchForm" action="index.php" method="get">
		<input type="hidden" name="page" value="searchindex" />
		<input type="text" value="" name="search"/>
		<br />
		<input type="submit" value="Keresés">
</form>
<?
if(isset ($data['search'])){
    $mit=array("/\\\'/","/\\\\\"/","/\\\\\\\/");
    $mire=array("'",'"',"\\");

    $search_original=issetEcho($data,'search');
    $search=preg_replace($mit,$mire,$search_original);
    $search="'".$search."'";
    $search='"*'.$search.'*"';

$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=Search.CollatorDSO;EXTENDED PROPERTIES='Application=Windows';");
$recordset = new COM('ADODB.Recordset');

$query="SELECT System.Search.AutoSummary
          FROM SYSTEMINDEX
          WHERE CONTAINS('".$search."')";
$recordset->Open($query,$conn);

while (!$recordset->EOF) {
    $summary=$recordset->Fields->Item("System.Search.AutoSummary")->Value;
    echo '...';
    echo substr($summary, strpos($summary, $search_original)-15, 15);
    echo '<b>'.$search_original.'</b>';
    echo substr($summary,strpos($summary,$search_original)+$search_original.length,15);
    echo '...<br/>';
    $recordset->MoveNext();	
}
}
?>
...
Ha valakinek esetleg van más megoldása azt is szívesen olvasnám még.
7

$a = preg_split('/[

deejayy · 2011. Aug. 12. (P), 08.19

  $a = preg_split('/[ \t\n\r]+/', preg_replace('/(' . $q . ')/i', '<b>$1</b>', $t));
  $result = '... ' . implode(' ', array_slice($a, max(0, $start-20), 40)) . ' ...';
$t -> keresési találat szövege
$a -> keresési találat szavanként tömbbe darabolva
$q -> keresett kifejezés
$start -> keresett kifejezés helye az $a tömbben (hányadik szó)

Miről van szó? Feldaraboljuk a keresési találatot szavakra, kicseréljük benne a keresési kifejezést félkövérre, majd (a példában) 20 szavas körzetben összefűzzük.