Sorl search based on term tid and scored is functional

This commit is contained in:
Bachir Soussi Chiadmi 2017-11-06 11:47:33 +01:00
parent 1e1a762b9b
commit e8586eb4da
6 changed files with 251 additions and 85 deletions

View File

@ -1,5 +1,5 @@
(function($){MaterioSearchApiAjax=function(){var _isloadingresults=false;var _$content=$('#content');function init(){initSearchAjax();initViewMode();};function initSearchAjax(){trace('initSearchAjax');$('#materio-search-api-search-form').bind('submit',function(event){setTimeout(function(){loadResults(getSearchKeys());},10);return false;});$('#materio-search-api-advanced-search-form').bind('submit',function(event){event.preventDefault();setTimeout(function(){loadResults(getSearchFilters(),'advanced');},10);return false;});$("#edit-searchfield").bind('autocompleteSelect',function(event){setTimeout(function(){loadResults(getSearchKeys(),"taxonomy");},10);}).bind('focus',function(event){$(this).select();});$(document).bind('theme-ready',onThemeReady).bind('init-scroller-pager',onInitScrollerPager).bind('load-scroller-pager',onLoadScrollerPager).bind('view-mode-changed',onViewModeChanged).bind('history-state-change',onHistoryStateChange);};function onThemeReady(event){if(isActuality()||isExplore()){$.event.trigger({type:'resultschanged',container:isActuality()?'#content .actuality-items':'#content .search-results'});}};function getSearchKeys(){return $('#materio-search-api-search-form').find('input[name*="searchfield"]').val();};function getSearchFilters(){var keys=[];$('#materio-search-api-advanced-search-form').find('.filter-line').each(function(i,line){var $selects=$($('.form-item.form-type-select select',line).get().reverse()).slice(0,-1);$selects.each(function(j,select){if($(select).val()!==""){keys.push('"'+$("option:selected",select).text()+'"');return false;}});});trace("getSearchFilters :: keys",keys);return keys.join("+");};function loadResults(keys,searchmode){trace('loadResults keys',keys);if(keys!==undefined&&keys!==''&&keys.length>=2){keys=keys.replace('/',' ');searchmode=searchmode||"fulltext";var types={},stringTypes=[];$('#edit-bundles-filter','#materio-search-api-search-form').find('input[type*="checkbox"]').each(function(i){$this=$(this);if($this.attr('checked'))
(function($){MaterioSearchApiAjax=function(){var _isloadingresults=false;var _$content=$('#content');function init(){initSearchAjax();initViewMode();};function initSearchAjax(){trace('initSearchAjax');$('#materio-search-api-search-form').bind('submit',function(event){setTimeout(function(){loadResults(getSearchKeys());},10);return false;});$("#edit-searchfield").bind('autocompleteSelect',function(event){setTimeout(function(){loadResults(getSearchKeys(),"taxonomy");},10);}).bind('focus',function(event){$(this).select();});$(document).bind('theme-ready',onThemeReady).bind('init-scroller-pager',onInitScrollerPager).bind('load-scroller-pager',onLoadScrollerPager).bind('view-mode-changed',onViewModeChanged).bind('history-state-change',onHistoryStateChange);};function onThemeReady(event){if(isActuality()||isExplore()){$.event.trigger({type:'resultschanged',container:isActuality()?'#content .actuality-items':'#content .search-results'});}};function getSearchKeys(){return $('#materio-search-api-search-form').find('input[name*="searchfield"]').val();};function getSearchFilters(){var keys=[];$('#materio-search-api-advanced-search-form').find('.filter-line').each(function(i,line){var $selects=$($('.form-item.form-type-select select',line).get().reverse()).slice(0,-1);$selects.each(function(j,select){if($(select).val()!==""){keys.push('"'+$("option:selected",select).text()+'"');return false;}});});trace("getSearchFilters :: keys",keys);return keys.join("+");};function loadResults(keys,searchmode){trace('loadResults keys',keys);if(keys!==undefined&&keys!==''&&keys.length>=2){keys=keys.replace('/',' ');searchmode=searchmode||"fulltext";var types={},stringTypes=[];$('#edit-bundles-filter','#materio-search-api-search-form').find('input[type*="checkbox"]').each(function(i){$this=$(this);if($this.attr('checked'))
stringTypes.push($this.val());types[$this.val()]=$this.attr('checked');});if(!_isloadingresults){$.event.trigger('loading-content');_isloadingresults=true;$('#materio-search-api-search-form').addClass('loading');$.getJSON(Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/search/',{'types':types,'current_path':document.location.href,'keys':keys,'searchmode':searchmode},function(json){$.event.trigger({type:"record-stat",categorie:'Search',action:keys,label:'filters : '+stringTypes.join(' ,'),value:json.count});if(json.redirect){window.location=json.redirect;}else{$.event.trigger('loaded-content');_isloadingresults=false;$('#materio-search-api-search-form').removeClass('loading');changeContent(json);}});}}};function loadActuality(){if(!_isloadingresults){$.event.trigger('loading-content');_isloadingresults=true;$('#materio-search-api-search-form').addClass('loading');var url=Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/actuality';$.getJSON(url,function(json){$.event.trigger('loaded-content');_isloadingresults=false;$('#materio-search-api-search-form').removeClass('loading');changeContent(json);});}};function changeContent(json){if(json.returned){$.event.trigger('loaded-content');$('.inner-content',_$content).html(json.returned).find('ul.pager').hide();triggerContentChanged();}else{}
$.event.trigger({type:'new-history-page',path:Drupal.settings.basePath+Drupal.settings.pathPrefix+json.path,title:json.title,content:json.returned});for(language in Drupal.settings.materio_search_api_ajax.languages){var l=Drupal.settings.materio_search_api_ajax.languages[language];$('#block-locale-language li.'+language+' a').attr('href',Drupal.settings.basePath+l.prefix+'/'+json.search_path+'/'+json.keys)};};function triggerContentChanged(){$.event.trigger({type:'resultschanged',container:'#content .search-results, #content .actuality-items'});};function onInitScrollerPager(event){if(isActuality()||isExplore())
event.pager.hide();};function onLoadScrollerPager(event){if(!_isloadingresults){if(isExplore())

View File

@ -0,0 +1,2 @@
(function($){Drupal.behaviors.field_materio_showroom_location={attach:function(context){$(".field-multiple-drag",".field-type-field-materio-showroom-location").hide();}}})(jQuery);

View File

@ -35,15 +35,15 @@ MaterioSearchApiAjax = function(){
});
// filtered search form
$('#materio-search-api-advanced-search-form').bind('submit', function(event) {
event.preventDefault();
// trace('advanced search submited', event);
// var $this = $(this);
setTimeout(function(){
loadResults(getSearchFilters(), 'advanced');
},10);
return false;
});
// $('#materio-search-api-advanced-search-form').bind('submit', function(event) {
// event.preventDefault();
// // trace('advanced search submited', event);
// // var $this = $(this);
// setTimeout(function(){
// loadResults(getSearchFilters(), 'advanced');
// },10);
// return false;
// });
// /!\ AUTOCOMPLETE SELECT EVENT need a patch http://drupal.org/node/365241#comment-5374686
$("#edit-searchfield")

View File

@ -31,6 +31,13 @@ function materio_search_api_settings(){
'#title' => t('Taxonomy search api index for %lang contents.', array('%lang'=>$name)),
);
$form['advancedsearchindex_'.$lcode] = array(
'#type'=>'select',
'#options'=>$index_options,
'#default_value' => variable_get('advancedsearchindex_'.$lcode, -1),
'#title' => t('Advanced search api index for %lang contents.', array('%lang'=>$name)),
);
$form['brevessearchindex_'.$lcode] = array(
'#type'=>'select',
'#options'=>$index_options,

View File

@ -180,30 +180,47 @@ function materio_search_api_entity_property_info_alter(&$info){
$node_props = &$info['node']['properties'];
for ($i=1; $i <= 5 ; $i++) {
$node_props['materio_search_api_onthologie_term_'.$i.'_text'] = array(
'type'=>'text',
'label'=> t('Main onthologie term '.$i. ' as text (+ synonyms)'),
'getter callback'=>'materio_search_api_get_onthologie_term_'.$i.'_text',
$fields = msa_get_custom_onto_taxo_searchable_fields();
foreach ($fields['termname'] as $field) {
$node_props[$field['name']] = array(
'type'=>$field['type'],
'label'=> $field['label'],
'getter callback'=>$field['getter']
);
$node_props['materio_search_api_onthologie_term_'.$i.'_tid'] = array(
'type'=>'text',
'label'=> t('Main onthologie term '.$i. ' as tid'),
'getter callback'=>'materio_search_api_get_onthologie_term_'.$i.'_tid',
}
foreach ($fields['tid'] as $field) {
$node_props[$field['name']] = array(
'type'=>$field['type'],
'label'=> $field['label'],
'getter callback'=>$field['getter']
);
}
$node_props['materio_search_api_onthologie_term_others_text'] = array(
'type'=>'list<text>',
'label'=> t('Others onthologie terms as text (+ synonyms)'),
'getter callback'=>'materio_search_api_get_taxonomy_terms_others_text',
);
// for ($i=1; $i <= 5 ; $i++) {
// $node_props['materio_search_api_onthologie_term_'.$i.'_text'] = array(
// 'type'=>'text',
// 'label'=> t('Main onthologie term '.$i. ' as text (+ synonyms)'),
// 'getter callback'=>'materio_search_api_get_onthologie_term_'.$i.'_text',
// );
// $node_props['materio_search_api_onthologie_term_'.$i.'_tid'] = array(
// 'type'=>'text',
// 'label'=> t('Main onthologie term '.$i. ' as tid'),
// 'getter callback'=>'materio_search_api_get_onthologie_term_'.$i.'_tid',
// );
// }
//
// $node_props['materio_search_api_onthologie_term_others_text'] = array(
// 'type'=>'list<text>',
// 'label'=> t('Others onthologie terms as text (+ synonyms)'),
// 'getter callback'=>'materio_search_api_get_taxonomy_terms_others_text',
// );
$node_props['materio_search_api_onthologie_term_others_tid'] = array(
'type'=>'list<text>',
'label'=> t('Others onthologie terms as tid'),
'getter callback'=>'materio_search_api_get_taxonomy_terms_others_tid',
);
// $node_props['materio_search_api_onthologie_term_others_tid'] = array(
// 'type'=>'list<text>',
// 'label'=> t('Others onthologie terms as tid'),
// 'getter callback'=>'materio_search_api_get_taxonomy_terms_others_tid',
// );
$node_props['materio_search_api_taglibres_text'] = array(
'type'=>'list<text>',
@ -211,7 +228,6 @@ function materio_search_api_entity_property_info_alter(&$info){
'getter callback'=>'materio_search_api_get_taglibres_terms_text',
);
$node_materiau_props = &$info['node']['bundles']['materiau']['properties'];
$node_materiau_props['materio_search_api_node_propertie_companie'] = array(
@ -220,7 +236,6 @@ function materio_search_api_entity_property_info_alter(&$info){
'getter callback'=>'materio_search_api_get_node_propertie_companie',
);
// TAXONOMIE TERMS PROPERTIES
$term_props = &$info['taxonomy_term']['properties'];
@ -239,6 +254,38 @@ function materio_search_api_entity_property_info_alter(&$info){
// );
}
function msa_get_custom_onto_taxo_searchable_fields(){
for ($i=1; $i <= 5 ; $i++) {
$fields_name['termname'][] = array(
'type' => 'text',
'name' => 'materio_search_api_onthologie_term_'.$i.'_text',
'label' => t('Main onthologie term '.$i. ' as text (+ synonyms)'),
'getter' => 'materio_search_api_get_onthologie_term_'.$i.'_text'
);
$fields_name['tid'][] = array(
'type' => 'text',
'name' => 'materio_search_api_onthologie_term_'.$i.'_tid',
'label' => t('Main onthologie term '.$i. ' as tid'),
'getter' => 'materio_search_api_get_onthologie_term_'.$i.'_tid'
);
}
$fields_name['termname'][] = array(
'type'=>'list<text>',
'name' => 'materio_search_api_onthologie_term_others_text',
'label' => t('Others onthologie terms as text (+ synonyms)'),
'getter' => 'materio_search_api_get_taxonomy_terms_others_text'
);
$fields_name['tid'][] = array(
'type'=>'list<text>',
'name' => 'materio_search_api_onthologie_term_others_tid',
'label' => t('Others onthologie terms as tid'),
'getter' => 'materio_search_api_get_taxonomy_terms_others_tid'
);
return $fields_name;
}
/**
* taxonomy propoerties as text + synonymes
*/
@ -750,9 +797,11 @@ function materio_search_api_advanced_search_form($form, &$form_state){
// global $user;
// $form = array();
// TODO: get vid from settings
// get vid from settings
$vid = variable_get('msa-advancedsearchvocabulary', null);
if($vid){
// global $language;
// dsm($language, "language");
$voc = taxonomy_vocabulary_load($vid);
$voc_machinename = $voc->machine_name;
@ -775,18 +824,33 @@ function materio_search_api_advanced_search_form($form, &$form_state){
// get the keywords from args and reconstruct the filter lines with default values
$args_values = array();
if($path == 'explore/filters' && $args[0] !== "ajax"){
$keywords = explode("+", $args[0]);
// TODO: what if a keyword contains a +
// dsm($keywords, 'keywords');
foreach ($keywords as $key => $value) {
$name = str_replace('"', '', $value);
//Get the term
$terms = taxonomy_get_term_by_name($name, $voc_machinename);
$term = array_shift($terms);
// WORKING WITH TERM NAMES instead of tids
// $keywords = explode("+", $args[0]);
// // dsm($keywords, 'keywords');
// foreach ($keywords as $key => $value) {
// $name = str_replace('"', '', $value);
// //Get the term
// $terms = taxonomy_get_term_by_name($name, $voc_machinename);
// $term = array_shift($terms);
// // dsm($term, $term->tid.' : '.$term->name);
// // get parents
// if(isset($term->tid)){
// $parents = taxonomy_get_parents_all($term->tid);
// // dsm($parents, 'parents');
// // build default values
// for ($p=count($parents)-1; $p >=0 ; $p--) {
// $args_values[$key][] = $parents[$p]->tid;
// }
// }
// }
// WORKING WITH TIDS instead of term name
$tids = explode("+", $args[0]);
foreach ($tids as $key => $tid) {
$term = taxonomy_term_load($tid);
// dsm($term, $term->tid.' : '.$term->name);
// get parents
if(isset($term->tid)){
$parents = taxonomy_get_parents_all($term->tid);
$parents = taxonomy_get_parents_all($tid);
// dsm($parents, 'parents');
// build default values
for ($p=count($parents)-1; $p >=0 ; $p--) {
@ -843,11 +907,14 @@ function materio_search_api_advanced_search_form($form, &$form_state){
}
// build first level taxonomy tree and select options
$taxotree = taxonomy_get_tree($vid, 0, 1, false);
$taxotree = taxonomy_get_tree($vid, 0, 1, true);
// $taxotree = msa_get_taxo_tree($vid, 0, 1);
// dsm($taxotree, "taxotree");
// return $form;
foreach ($taxotree as $index => $term) {
// TODO: get translated tag name
if(!in_array($term->tid, $hidden_terms)){
$level_0_ops[$term->tid] = t($term->name);
$level_0_ops[$term->tid] = $term->name;
}
}
@ -909,11 +976,13 @@ function materio_search_api_advanced_search_form($form, &$form_state){
if($default0){
// build second level taxonomy tree and select options
$taxotree1 = taxonomy_get_tree($vid, $default0, 1, false);
$taxotree1 = taxonomy_get_tree($vid, $default0, 1, true);
// dsm($taxotree1, 'taxotree1');
$level_1_ops = array();
foreach ($taxotree1 as $index => $term) {
// TODO: get translated tag name
$level_1_ops[$term->tid] = t($term->name);
// $term = taxonomy_term_load($tid);
$level_1_ops[$term->tid] = $term->name;
}
// get the default value
@ -948,7 +1017,7 @@ function materio_search_api_advanced_search_form($form, &$form_state){
if($default1){
// build second level taxonomy tree and select options
$taxotree2 = taxonomy_get_tree($vid, $default1, 1, false);
$taxotree2 = taxonomy_get_tree($vid, $default1, 1, true);
if(count($taxotree2)){
// $default2 = isset($args_values[$l][2]) ? $args_values[$l][2] : 0;
$default2 = null;
@ -1052,6 +1121,36 @@ function materio_search_api_advanced_search_form($form, &$form_state){
return $form;
}
function msa_get_taxo_tree($vid, $parent, $depth){
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'taxonomy_term')
->propertyCondition('vid', $vid);
// ->propertyCondition('parent', $parent);
// ->propertyCondition('status', 1);
// ->entityCondition('bundle', $voc_machinename)
$result = $query->execute();
if (isset($result['taxonomy_term'])) {
$terms = $result['taxonomy_term'];
// At first we need to get field's id. If you already know field id, you can ommit this step
// Get all fields attached to a given node type
$fields = field_info_instances('taxonomy_term');
// Get id of body field
// $field_id = $fields['name']['field_id'];
// Attach a field of selected id only to get value for it
field_attach_load('taxonomy_term', $terms, FIELD_LOAD_CURRENT, array('field_id' => 'name'));
// Get values of our node field
// $output = field_get_items('node', $stories, 'field_story_image');
}
return $terms;
}
function materio_search_api_advanced_search_select_callback($form, &$form_state) {
return $form['filters'];
}
@ -1078,14 +1177,16 @@ function materio_search_api_advanced_search_form_submit($form, &$form_state){
$values = $form_state['values'];
$filterlines = isset($form_state['filterlines']) ? $form_state['filterlines'] : 0;
$keywords = array();
// $keywords = array();
// extract last tag of each lines
for ($l=0; $l < $filterlines ; $l++) {
for ($i=2; $i > 0 ; $i--) {
if(isset($values['filter-'.$l.'-'.$i]) && $values['filter-'.$l.'-'.$i]){
$term = taxonomy_term_load($values['filter-'.$l.'-'.$i]);
$keywords[$term->tid] = '"'.$term->name.'"';
// $term = taxonomy_term_load($values['filter-'.$l.'-'.$i]);
// $keywords[$term->tid] = '"'.$term->name.'"';
// $tids[] = '"'.$values['filter-'.$l.'-'.$i].'"';
$tids[] = $values['filter-'.$l.'-'.$i];
continue 2;
}else{
continue;
@ -1095,7 +1196,7 @@ function materio_search_api_advanced_search_form_submit($form, &$form_state){
// dsm($keywords, 'keywordstid');
$keywords_str = implode("+", $keywords);
$keywords_str = implode("+", $tids);
// dsm($keywords_str);

View File

@ -346,49 +346,96 @@ function msa_solrquery_materiauxbreves($keys, $language, $user, $offset, $limit)
return $return;
}
function msa_solrquery_filterssearch($keys, $language, $user, $offset, $limit){
// dsm($keys, "keys");
$keys = explode("+", $keys);
foreach ($keys as $value) {
$tids[] = intval($value);
}
// dsm($tids, "tids");
// dsm($offset, 'offset');
// dsm($limit, 'limit');
# define search api solr index
$taxo_index_machine_name = variable_get('taxonomysearchindex_'.$language->language, -1);
$taxo_index = search_api_index_load($taxo_index_machine_name);
# choose solr query options
$query_options = array('conjunction'=>'AND', 'parse mode'=>'terms');
#create the solr query for taxonomy search
$taxo_query = search_api_query($taxo_index_machine_name, $query_options)
->keys($keys);
// ->range($offset, $limit);
# apply bundle options to solr query if usefull
if(count($bundles_filter)){
$filter = $taxo_query->createFilter('OR');
foreach ($bundles_filter as $type)
$filter->condition('type', $type, '=');
$taxo_query->filter($filter);
}
// $query->setOption('search_api_bypass_access', true);
# add user access solr query option
$taxo_query->setOption('search_api_access_account', $user);
// $taxo_query->setOption('q.op', 'OR');
#execute first time to get the all items, to be able to filter the full text research
$taxo_total_results = $taxo_query->execute();
// dsm($taxo_total_results, "taxo total results");
// init empty results array in wich we will concaten different queries
$return = array(
"results" => $taxo_total_results['results']
"results" => array()
);
# define search api solr index
$advancedsearch_index_machine_name = variable_get('advancedsearchindex_'.$language->language, -1);
// dsm($advancedsearch_index_machine_name);
$taxo_index = search_api_index_load($advancedsearch_index_machine_name);
# choose solr query options
$query_options = array('conjunction'=>'AND');
// get searchable field names and run one by one the search
// eventualy concat all results
$fields = msa_get_custom_onto_taxo_searchable_fields();
// run a search for each tag (results will be intersected later)
foreach ($tids as $i => $tid) {
$tmps_results[$i] = array();
// run a search for a tag for each field
foreach ($fields['tid'] as $field) {
# create the solr query for taxonomy search
$query = search_api_query($advancedsearch_index_machine_name, $query_options);
// ->keys("*:*");
// ->range($offset, $limit);
// https://www.drupal.org/node/2596523
$filter = $query->createFilter('AND');
$filter->condition($field['name'], $tid);
$query->filter($filter);
# add user access solr query option
$query->setOption('search_api_access_account', $user);
// $query->setOption('search_api_bypass_access', true);
# execute
$results = $query->execute();
// dsm($results, "results");
// concat each field results for one tag
$tmps_results[$i] += $results['results'];
}
}
// dsm($tmps_results, "tmp_resuslts");
// do the intersect and score routine
if (count($tmps_results) > 1) {
// if we have more than one tag
$results_intersected = array_intersect_key($tmps_results[0], $tmps_results[1]);
if(count($tmps_results > 2)){
// if we have more than 2 tags
for ($i=2; $i < count($tmps_results); $i++) {
$results_intersected = array_intersect_key($results_intersected, $tmps_results[$i]);
}
}
// dsm($results_intersected, 'results_intersected');
foreach ($results_intersected as $tid => $v) {
$scores = array();
for ($j=0; $j < count($tmps_results); $j++) {
$i = 0;
foreach ($tmps_results[$j] as $key => $vv) {
if ($tid === $key) {
$scores[] = $i;
break;
}
$i++;
}
}
$results_intersected[$tid]['score'] = array_sum($scores) / count($scores);
}
uasort($results_intersected, "msa_cmp_filtered_results");
// dsm($results_intersected, 'results_intersected scored');
}
$return['results'] = $results_intersected;
# count global results
$return['result count'] = count($return['results']);
$return['result count'] = count($results_intersected);
# create items array with the good range
$return['items'] = array();
@ -409,6 +456,15 @@ function msa_solrquery_filterssearch($keys, $language, $user, $offset, $limit){
}
function msa_cmp_filtered_results($a, $b){
// dsm($a, "a");
// dsm($b, "b");
if ($a['score'] == $b['score']) {
return 0;
}
return ($a['score'] < $b['score']) ? -1 : 1;
}
# not used anymore as free users not exists anymore
function msa_solrquery_breves($typed, $language, $user, $offset, $limit){