/** * * @brief xapian query * @param array $params * @param int $page * @param int $pagesize */ public static function searchHospital($disease = '', $province = '', $city = '', $district = '', $street = '', $level = 0, $keyword = '', $page = '', $pagesize = 20, $id = '') { $page = empty($page) ? 1 : $page; if (!self::_connect('/var/www/html/diary/xapian/hospital')) { return false; } // if ($keyword) { $realQuery = DBScws::cutWord($keyword, true); } // if ($disease) { $realQuery[] = 'DISEASE' . $disease; } // if ($province) { $realQuery[] = 'PROVINCE' . $province; } // if ($city) { $realQuery[] = 'CITY' . $city; } // if ($district) { $realQuery[] = 'DISTRICT' . $district; } // if ($street) { $realQuery[] = 'STREET' . $street; } // if ($level) { $realQuery[] = 'LEVEL' . $level; } //id if ($id) { $realQuery[] = 'ID' . $id; } if (empty($realQuery)) { $realQuery[] = 'HOSPITAL' . 'default'; } $queryparser = new XapianQueryParser(); $queryparser->set_database(self::$_INSTANCE); $enquire = new XapianEnquire(self::$_INSTANCE); $enquire->set_sort_by_value(0); // $query = new XapianQuery(XapianQuery::OP_AND, $realQuery); $enquire->set_query($query); $matches = $enquire->get_mset(0, 4000); // $start = $matches->begin(); $end = $matches->end(); $count = $matches->size(); $index = 0; $re = array(); while (!$start->equals($end)) { $data = array(); if ($index < $page * $pagesize && $index >= ($page - 1) * $pagesize) { $doc = $start->get_document(); $result = json_decode($doc->get_data(), true); $result['phone'] = $result['contact']; $r = explode("||", $result['title']); $result['title'] = $r[0]; $r = explode(",", $result['contact']); $result['contact'] = $r[0]; unset($result['puid'], $result['thumb_img'], $result['score'], $result['website'], $result['post_at'], $result['refresh_at'], $result['grab_url'], $result['ad_status'], $result['ad_types'], $result['user_id'], $result['username'], $result['listing_status'], $result['base_tag'], $result['image_count']); $re[] = $result; /* $termStart = $doc->termlist_begin(); $termEnd = $doc->termlist_end(); $d['term']=''; while (!($termStart->equals($termEnd))) { $d['term'].= '|'.$termStart->get_term(); $termStart->next(); } var_dump($d); */ } elseif ($index >= $page * $pagesize) { break; } $start->next(); $index++; } return array($re, $count); }
} $eset = $enquire->get_eset(100, $rset, XapianEnquire::USE_EXACT_TERMFREQ, 1.0, NULL, 1.9); $min_wt = 0; foreach ($eset->begin() as $i => $dummy) { $min_wt = $i->get_weight(); } if ($min_wt < 1.9) { print "ESet min_wt threshold not applied\n"; exit(1); } if (XapianQuery::OP_ELITE_SET != 10) { print "OP_ELITE_SET is XapianQuery::OP_ELITE_SET not 10\n"; exit(1); } # Regression test - overload resolution involving boolean types failed. $enq->set_sort_by_value(1, TRUE); # Regression test - fixed in 0.9.10.1. $oqparser = new XapianQueryParser(); $oquery = $oqparser->parse_query("I like tea"); # Regression test for bug#192 - fixed in 1.0.3. $enq->set_cutoff(100); # Check DateValueRangeProcessor works. function add_vrp_date(&$qp) { $vrpdate = new XapianDateValueRangeProcessor(1, 1, 1960); $qp->add_valuerangeprocessor($vrpdate); } $qp = new XapianQueryParser(); add_vrp_date($qp); $query = $qp->parse_query('12/03/99..12/04/01'); if ($query->get_description() !== 'Query(0 * VALUE_RANGE 1 19991203 20011204)') {
function search($query, $num = 20) { $db = new XapianDatabase(XAPIAN_DIR); $enquire = new XapianEnquire($db); $stemmer = new XapianStem("english"); $qp = new XapianQueryParser(); $valuerange = new XapianNumberValueRangeProcessor(0); $qp->set_stemmer($stemmer); $qp->set_database($db); $qp->set_stemming_strategy(XapianQueryParser::STEM_SOME); $qp->set_default_op(Query_OP_AND); $qp->add_boolean_prefix('align', 'A'); $qp->add_boolean_prefix('colour', 'C'); $qp->add_boolean_prefix('ep', 'E'); $qp->add_boolean_prefix('noise', 'N'); $qp->add_boolean_prefix('series', 'S'); $qp->add_valuerangeprocessor($valuerange); $query = $qp->parse_query($query, XapianQueryParser::FLAG_BOOLEAN | XapianQueryParser::FLAG_PHRASE | XapianQueryParser::FLAG_LOVEHATE | XapianQueryParser::FLAG_WILDCARD | XapianQueryParser::FLAG_SPELLING_CORRECTION); $enquire->set_query($query); $enquire->set_sort_by_value(1, true); $matches = $enquire->get_mset(0, $num); $desc = $query->get_description(); $estimate = $matches->get_matches_estimated(); $out = array(); $iter = $matches->begin(); while (!$iter->equals($matches->end())) { $doc = $iter->get_document(); $data = array('text' => $doc->get_data()); $rank = $iter->get_rank() + 1; $termiter = $doc->termlist_begin(); $terms = array(); while (!$termiter->equals($doc->termlist_end())) { $term = $termiter->get_term(); $prefix = substr($term, 0, 1); if ($prefix == 'A') { $data['align'] = substr($term, 1); } elseif ($prefix == 'B') { $data['begin'] = substr($term, 1); } elseif ($prefix == 'C') { $data['colour'] = substr($term, 1); } elseif ($prefix == 'E') { $data['ep'] = substr($term, 1); } elseif ($prefix == 'N') { $data['noise'] = substr($term, 1); } elseif ($prefix == 'I') { $data['pos'] = $term; } elseif ($prefix == 'S') { $data['series'] = substr($term, 1); } else { $data['terms'][] = $term; } $termiter->next(); } $out[] = $data; $iter->next(); } $db = null; return array( 'query' => $desc, 'estimate' => $estimate, 'data' => $out, ); }