Lucene arama sayısal değerleri dizin değil mu?

4 Cevap php

Ben (Zend Framework uygulamasını kullanarak) PHP lucene kullanıyorum. Ben bir sayı içeren bir alanda arama yapamazsınız bir sorun yaşıyorum.

İşte endeksindeki veriler:

      ts      |    contents
--------------+-----------------
  1236917100  | dog cat gerbil
  1236630752  |  cow pig goat
  1235680249  | lion tiger bear
  nonnumeric  | bass goby trout

My problem: "ts:1236630752" getiriler isabetleri için bir sorgu. Ancak, "ts:nonnumeric" için bir sorgu bir hit döndürür.

I according to documentation bir kelime alanına, gibi "ts" depolamak.Bu "tokenized değil, endeksli ve saklanır. Non-metin alanları, örneğin tarih veya url için yararlı." Ben bir "metin" alanı olarak tedavi denedi, ama davranış ts metin olduğunda bir sorgu için "ts:*" hiçbir şey döndürür dışında aynıdır.

Ben Zend Framework 1.7 (sadece son 3 gün önce indirilen) ve PHP 5.2.9 kullanıyorum. İşte benim kod:

<?php

//=========================================================
// Initializes Zend Framework (Zend_Loader).
//=========================================================
set_include_path(realpath('../library') . PATH_SEPARATOR . get_include_path());
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();

//=========================================================
// Delete existing index and create a new one
//=========================================================
define('SEARCH_INDEX', 'test_search_index');
if(file_exists(SEARCH_INDEX))
  foreach(scandir(SEARCH_INDEX) as $file)
    if(!is_dir($file))
      unlink(SEARCH_INDEX . "/$file");

$index = Zend_Search_Lucene::create(SEARCH_INDEX);

//=========================================================
// Create this data in index:
//         ts      |    contents
//   --------------+-----------------
//     1236917100  | dog cat gerbil
//     1236630752  |  cow pig goat
//     1235680249  | lion tiger bear
//     nonnumeric  | bass goby trout
//=========================================================

function add_to_index($index, $ts, $contents) {
  $doc = new Zend_Search_Lucene_Document();
  $doc->addField(Zend_Search_Lucene_Field::Keyword('ts', $ts));
  $doc->addField(Zend_Search_Lucene_Field::Text('contents', $contents));
  $index->addDocument($doc);
}

add_to_index($index, '1236917100', 'dog cat gerbil');
add_to_index($index, '1236630752', 'cow pig goat');
add_to_index($index, '1235680249', 'lion tiger bear');
add_to_index($index, 'nonnumeric', 'bass goby trout');

//=========================================================
// Run some test queries and output results
//=========================================================

echo '<html><body><pre>';

function run_query($index, $query) {
  echo "Running query:  $query\n";
  $hits = $index->find($query);
  echo 'Got ' . count($hits) . " hits.\n";
  foreach($hits as $hit)
    echo "  ts='$hit->ts', contents='$hit->contents'\n";
  echo "\n";
}

run_query($index, 'pig');           //1 hit
run_query($index, 'ts:1236630752'); //0 hits
run_query($index, '1236630752');    //0 hits
run_query($index, 'ts:pig');        //0 hits
run_query($index, 'contents:pig');  //1 hits
run_query($index, 'ts:[1236630700 TO 1236630800]'); //0 hits (range query)
run_query($index, 'ts:*');          //4 hits if ts is keyword, 1 hit otherwise
run_query($index, 'nonnumeric');    //1 hits
run_query($index, 'ts:nonnumeric'); //1 hits
run_query($index, 'trout');         //1 hits

Output

Running query:  pig
Got 1 hits.
  ts='1236630752', contents='cow pig goat'

Running query:  ts:1236630752
Got 0 hits.

Running query:  1236630752
Got 0 hits.

Running query:  ts:pig
Got 0 hits.

Running query:  contents:pig
Got 1 hits.
  ts='1236630752', contents='cow pig goat'

Running query:  ts:[1236630700 TO 1236630800]
Got 0 hits.

Running query:  ts:*
Got 4 hits.
  ts='1236917100', contents='dog cat gerbil'
  ts='1236630752', contents='cow pig goat'
  ts='1235680249', contents='lion tiger bear'
  ts='nonnumeric', contents='bass goby trout'

Running query:  nonnumeric
Got 1 hits.
  ts='nonnumeric', contents='bass goby trout'

Running query:  ts:nonnumeric
Got 1 hits.
  ts='nonnumeric', contents='bass goby trout'

Running query:  trout
Got 1 hits.
  ts='nonnumeric', contents='bass goby trout'

4 Cevap

Find () yöntemi sorgu tokenizes ve varsayılan Analzer ile sayıları oldukça fazla göz ardı olacaktır. Eğer construct the query için var bir numara aramak veya sayısal değerler içeren bir alternatif analyzer kullanmak istiyorsanız ..

http://framework.zend.com/manual/en/zend.search.lucene.searching.html

It is important to note that the query parser uses the standard analyzer to tokenize separate parts of query string. Thus all transformations which are applied to indexed text are also applied to query strings.

The standard analyzer may transform the query string to lower case for case-insensitivity, remove stop-words, and stem among other transformations.

The API method doesn't transform or filter input terms in any way. It's therefore more suitable for computer generated or untokenized fields.

Ben kodu doğruysa ben söyleyemem Java altında lucene kullanmaya alışkınım ama alan [a-Za-z] exept şey sıyırma bir şekilde tokanized ediliyor gibi görünüyor.

Bu dizin tam olarak ne olduğunu görmek için http://www.getopt.org/luke/ gibi bir dizin kaşif aracı kullanmak için duruma ışık tutacak yardımcı olabilir.

Maybe you could try with Sphinx engine. I am running a site with more than 1 million regs , and sphinx its incredibly fast! The php api its also very easy to use.

http://www.sphinxsearch.com/powered.html

Ben oldukça kolay (kullanımı :: setDefault (...) yukarıda açıklandığı gibi varsayılan olarak Zend / Arama / Lucene / Analiz / Analiz / Ortak / TextNum.php kullanarak metin ve sayıları elde edebildi.

Benim sorunum endeksi uzun bir geçmişi ve birçok sürüm numaraları gayrimenkulünü yazılım ve donanım büyük bir set çalışıyor olmasıdır. Zend ara Lucene "1.5.3" veya nokta (IP adresleri, örneğin) ile bir şey gibi "kelimeler" tokenizing değil, çizgi veya tire.

Ben ilk TextNum.php bir kopyasını yaptı TextNumSSC.php (SSC bizim uygulama adıdır) adını ve RegEx düzenleme çalıştı:

do {
                 if (! preg_match('/[a-zA-Z0-9.-_]+/', $this->_input, $match, PREG_OFFSET_CAPTURE, $this->_position)) { 
                     // It covers both cases a) there are no matches (preg_match(...) === 0)
                     // b) error occured (preg_match(...) === FALSE)
                     return null;
                 }

Hala şans.

Sonra http://codefury.net/projects/StandardAnalyzer/ talimat şekilde, Zend dizin yapısı dışında, için RegEx değişti yüklü

'/[a-zA-Z0-9.-_]+/'

ve şimdi çalışıyor.

Bu kök neden emin değilim, ama bu nokta sorunu gidermek için SO veya web üzerinde herhangi bir şey bulamadı.