2017-03-27 24 views
0

Ive目前在使用PHP/Solarium时偶然发现Solr出现了一个奇怪的行为。在FilderQuery中与Solarium进行分离

我构建了一个filterQuery查询并把它建立这样的:

$select = array(
     'query'  => $this->getSearchTermForQuery(), 
     'fields' => '*,score', 
     'start'  => $this->numResultsPerPage * ($this->currentPage-1), 
     'rows'  => $this->numResultsPerPage, 
     'component' => array(
      'edismax' => array(
       'queryfields' => implode(' ', array(
        $this->queryFields['firstArray'], 
        $this->queryFields['secondArray'], 
        $this->queryFields['thirdArray'], 
       )), 
      ), 
     ), 
     'sort' => $this->orderBy, 
    ); 

方法“getSearchTermForQuery()”建立串至极发送到Solr的服务器。 它只适用于单词或“夏季和冬季”等组合。现在我想实现一个分离,如果它明确地要求从用户输入。所以会出现一个类似“Summer或Winter”的字符串。 这一个完美的作品。现在,如果我喜欢“(夏天和冬天)或冬天”,它会变得复杂。在这种情况下,我得到一个非常奇怪的结果。

你好, 我的旧例子没有意义了,所以我删除了它们。我现在的状态更好地解释如下。

我现在更接近我认为的问题。在当前状态下,我使用edismax queryparser。 我的查询是这样的:

#queryString: "((+"Test"+"Sommer")(+"Test"))" 

随着queryfields一切的低量似乎工作,并解析查询看起来是这样的:

#parsedQuery: "(+((+DisjunctionMaxQuery((content:test | daad_imperia_title:test)) +DisjunctionMaxQuery((content:somm | daad_imperia_title:somm))) (+DisjunctionMaxQuery((content:test | daad_imperia_title:test)))))/no_coord" 

这将产生预期的结果/行为。 但是,如果我使用所有查询字段,我希望分析查询的结构发生变化。它看起来像这样:

#parsedQuery: "(+DisjunctionMaxQuery(((daad_stipdb_title:test daad_stipdb_title:summ daad_stipdb_title:test) | (daad_stipdb_furtherInformation:test daad_stipdb_furtherInformation:summ daad_stipdb_furtherInformation:test) | (daad_imperia_documentTitle:test daad_imperia_documentTitle:summ daad_imperia_documentTitle:test) | (daad_iO_hsportrait:test daad_iO_hsportrait:summer daad_iO_hsportrait:test) | (daad_imperia_forename:test daad_imperia_forename:summer daad_imperia_forename:test) | (daad_imperia_subtitle:test daad_imperia_subtitle:summer daad_imperia_subtitle:test) | (daad_stipdb_targetGroup:test daad_stipdb_targetGroup:summ daad_stipdb_targetGroup:test) | (daad_stipdb_moreInformation:test daad_stipdb_moreInformation:summ daad_stipdb_moreInformation:test) | (daad_stipdb_applicationLocation:test daad_stipdb_applicationLocation:summ daad_stipdb_applicationLocation:test) | (daad_iO_prepForSubject:test daad_iO_prepForSubject:summer daad_iO_prepForSubject:test) | (daad_imperia_multiselectLand:test daad_imperia_multiselectLand:summ daad_imperia_multiselectLand:test) | (daad_iO_cooperation:test daad_iO_cooperation:summer daad_iO_cooperation:test) | (daad_iO_addInformation:test daad_iO_addInformation:summer daad_iO_addInformation:test) | (daad_imperia_pmDocumentLabel01:test daad_imperia_pmDocumentLabel01:summ daad_imperia_pmDocumentLabel01:test) | (daad_stipdb_requirements:test daad_stipdb_requirements:summ daad_stipdb_requirements:test) | (daad_iO_digiCourseDescription:test daad_iO_digiCourseDescription:summer daad_iO_digiCourseDescription:test) | (daad_iO_institution:test daad_iO_institution:summer daad_iO_institution:test) | (daad_imperia_metaKeywords:test daad_imperia_metaKeywords:summ daad_imperia_metaKeywords:test) | (daad_imperia_multiselectTheme:test daad_imperia_multiselectTheme:summ daad_imperia_multiselectTheme:test) | (daad_stipdb_languageKnowledge:test daad_stipdb_languageKnowledge:summ daad_stipdb_languageKnowledge:test) | (daad_stipdb_subjects:test daad_stipdb_subjects:summ daad_stipdb_subjects:test) | (daad_stipdb_programName:test daad_stipdb_programName:summ daad_stipdb_programName:test) | (daad_imperia_metaDescription:test daad_imperia_metaDescription:summ daad_imperia_metaDescription:test) | (daad_imperia_intro:test daad_imperia_intro:summ daad_imperia_intro:test) | (url:test url:summer url:test) | (daad_iO_location:test daad_iO_location:summer daad_iO_location:test) | (daad_iO_digiCourseModules:test daad_iO_digiCourseModules:summer daad_iO_digiCourseModules:test) | (content:test content:summ content:test) | (daad_iO_subject:test daad_iO_subject:summer daad_iO_subject:test) | (daad_stipdb_teaser:test daad_stipdb_teaser:summ daad_stipdb_teaser:test) | (daad_imperia_pmLinkLabel01:test daad_imperia_pmLinkLabel01:summ daad_imperia_pmLinkLabel01:test) | (daad_iO_courseName:test daad_iO_courseName:summer daad_iO_courseName:test) | (daad_iO_keywords:test daad_iO_keywords:summer daad_iO_keywords:test) | (daad_imperia_linguas:test daad_imperia_linguas:summ daad_imperia_linguas:test) | (daad_stipdb_value:test daad_stipdb_value:summ daad_stipdb_value:test) | (daad_imperia_dateline:test daad_imperia_dateline:summ daad_imperia_dateline:test) | (daad_iO_organisation:test daad_iO_organisation:summer daad_iO_organisation:test) | (daad_imperia_profession:test daad_imperia_profession:summer daad_imperia_profession:test) | (daad_iO_fos:test daad_iO_fos:summer daad_iO_fos:test) | (daad_iO_internship:test daad_iO_internship:summer daad_iO_internship:test) | (daad_stipdb_efford:test daad_stipdb_efford:summ daad_stipdb_efford:test) | (daad_iO_degree:test daad_iO_degree:summer daad_iO_degree:test) | (daad_iO_studyAbroad:test daad_iO_studyAbroad:summer daad_iO_studyAbroad:test) | (daad_imperia_lastname:test daad_imperia_lastname:summer daad_imperia_lastname:test) | (daad_iO_cityPortrait:test daad_iO_cityPortrait:summer daad_iO_cityPortrait:test) | (daad_imperia_contact:test daad_imperia_contact:summ daad_imperia_contact:test) | (daad_stipdb_subjectGroups:test daad_stipdb_subjectGroups:summ daad_stipdb_subjectGroups:test) | (daad_imperia_subhead:test daad_imperia_subhead:summ daad_imperia_subhead:test) | (daad_imperia_professionShort:test daad_imperia_professionShort:summer daad_imperia_professionShort:test) | (daad_stipdb_targets:test daad_stipdb_targets:summ daad_stipdb_targets:test) | (daad_stipdb_status:test daad_stipdb_status:summ daad_stipdb_status:test) | (daad_stipdb_progType:test daad_stipdb_progType:summ daad_stipdb_progType:test) | (daad_stipdb_longNames:test daad_stipdb_longNames:summ daad_stipdb_longNames:test) | (daad_iO_typeOfIntitution:test daad_iO_typeOfIntitution:summer daad_iO_typeOfIntitution:test) | (daad_imperia_title:test daad_imperia_title:summ daad_imperia_title:test) | (daad_stipdb_length:test daad_stipdb_length:summ daad_stipdb_length:test) | (daad_stipdb_targetCountries:test daad_stipdb_targetCountries:summ daad_stipdb_targetCountries:test) | (daad_iO_leisureProgramme:test daad_iO_leisureProgramme:summer daad_iO_leisureProgramme:test) | (daad_stipdb_originCountries:test daad_stipdb_originCountries:summ daad_stipdb_originCountries:test) | (daad_iO_courseContent:test daad_iO_courseContent:summer daad_iO_courseContent:test) | (daad_stipdb_contacts:test daad_stipdb_contacts:summ daad_stipdb_contacts:test))))/no_coord" 

它只是创建一个大的dismaxQuery查询的所有单词。 有人有什么想法吗?我想我会发疯...

我希望有人可以给我一个提示。

最好的问候, 罗纳德

回答

1

免责声明:我Solr Query Debugger谷歌浏览器插件的作者。

主要取决于如何配置您的集合以及您使用的是哪种查询解析器(我假设为edismax)。

如果您可以拖尾Solr实例的日志文件,这将帮助您获得提交的真实查询。

通过这种方式,您可以在浏览器中使用该查询,然后对其进行调试。

事实上,我建议使用调试器来查看执行什么,并解释为什么你的查询有这样奇怪的行为。

还有其他的调试器:

因此,只要在浏览器中执行Solr的查询,如果它的工作原理,然后启动Solr的调试你喜欢。

在我的插件页面中,您会看到DebugEcho选项卡,其中解释了Solr执行的内容。在Explain标签中,您会看到树状结构的分数解释。

希望这会有所帮助。

+0

谢谢你的回答。我必须承认,我对这个问题并不深,因为我希望成为这样的人。 我在我的问题中添加了我的请求的日志。它不会让我变得更聪明,说实话。我希望你或其他人能从中读出一些东西。在希望获得更多答案时,我尽我所能地尝试了您所建议的调试器之一。 非常感谢 – LongRon

+0

你好。使用你的chrome插件,我发现这是parsedquery_toString: +((content:test | title:test^10.0 | url:test^7.0)(url:or^7.0)(content:summ | title:summ^10.0 | url:summer^7.0)(url:and^7.0)(content:test | title:test^10.0 | url:test^7.0)) 也许这里有提示吗? – LongRon

+0

@LongRon调试器可以帮助您了解相关性问题,但您应该已经知道Solr如何工作(查询解析器,过滤器链,标记化等)。看看你的第二条评论,我发现''和'和'或'as关键字在你的搜索中,但它们是搜索运营商。你在使用什么样的查询解析器,查看你的帖子编辑我看到'defType = dismax',但可能在你的评论中使用了另一个。 – freedev