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:
  1. <?php  
  2. $conn = new COM("ADODB.Connection"or die("Cannot start ADO");  
  3. $conn->Open('Provider=MSIDXS');  
  4. $results = $conn->Execute('Select Filename from Scope()');  
De kippróbáltam Windows Search-csel, és nagyszerű eredményeket kapok:
  1. <?php  
  2. $conn = new COM("ADODB.Connection"or die("Cannot start ADO");  
  3. $conn->Open("Provider=Search.CollatorDSO;EXTENDED PROPERTIES='Application=Windows';");  
  4. $recordset = new COM('ADODB.Recordset');  
  5. $recordset->Open('SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX'$conn);  
  6. while (!$recordset->EOF) {  
  7.   echo $recordset->Fields->Item("System.ItemPathDisplay")->Value, "\n";  
  8.   $recordset->MoveNext();  
  9. }  
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:
...
  1. <form name="searchForm" action="index.php" method="get">  
  2.         <input type="hidden" name="page" value="searchindex" />  
  3.         <input type="text" value="" name="search"/>  
  4.         <br />  
  5.         <input type="submit" value="Keresés">  
  6. </form>  
  7. <?  
  8. if(isset ($data['search'])){  
  9.     $mit=array("/\\\'/","/\\\\\"/","/\\\\\\\/");  
  10.     $mire=array("'",'"',"\\");  
  11.   
  12.     $search_original=issetEcho($data,'search');  
  13.     $search=preg_replace($mit,$mire,$search_original);  
  14.     $search="'".$search."'";  
  15.     $search='"*'.$search.'*"';  
  16.   
  17. $conn = new COM("ADODB.Connection"or die("Cannot start ADO");  
  18. $conn->Open("Provider=Search.CollatorDSO;EXTENDED PROPERTIES='Application=Windows';");  
  19. $recordset = new COM('ADODB.Recordset');  
  20.   
  21. $query="SELECT System.Search.AutoSummary  
  22.           FROM SYSTEMINDEX  
  23.           WHERE CONTAINS('".$search."')";  
  24. $recordset->Open($query,$conn);  
  25.   
  26. while (!$recordset->EOF) {  
  27.     $summary=$recordset->Fields->Item("System.Search.AutoSummary")->Value;  
  28.     echo '...';  
  29.     echo substr($summarystrpos($summary$search_original)-15, 15);  
  30.     echo '<b>'.$search_original.'</b>';  
  31.     echo substr($summary,strpos($summary,$search_original)+$search_original.length,15);  
  32.     echo '...<br/>';  
  33.     $recordset->MoveNext();    
  34. }  
  35. }  
  36. ?>  
...
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
  1. $a = preg_split('/[ \t\n\r]+/', preg_replace('/(' . $q . ')/i''<b>$1</b>'$t));  
  2. $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.