Solr Facet引发思考 on the road

2019-03-27 00:24|来源: 网路

Facet引发的思考


下面的内容包括概念都是个人想到的,不专业或者不规范请知晓。理解意义就行。

1.为什么是facet
搜索与推荐本来是不分家的,搜索没有推荐就是存储了,有推荐的搜索才是真正的搜索,才体现搜索的“情感”
(query解析、排序、页面展示)、搜索引擎的“难点”(用户意图理解、最有价值信息、最友好交互)。


但是搜索很多概念又是源于存储,例如
facet就是源于数据库的groupby。单纯的groupby,搜索肯定顶不过数据库。但是搜索有个好处,就是查询条件的文本、区间、模糊有优势,就是获取结果id有优势。之后的facet统计在存储不见得好于数据库。


另外,对于千万级别的数据,从成本、快捷、维护、重用、准实时角度看,使用
solrfacet无疑是首选。


使用时,或者是源数据直接进入索引、直接输出统计结果。或者是已经统计好了,只需输出结果。后者检索角色更浓,前者实时角色更浓。

2.facet相对hadoophive优势

Facet对轻量级处理应该更有优势。表现在灵活性比较强。一份索引,可以随时、随地facet各种信息。数据重用,既可以用一般查询,也可以用统计输出,无需中间结果,按需获取。低成本,开源的solrlucene系统,轻量级,没有hadoophive那么重。

3.solr当前支持程度

Solr当前支持stored=true

文本域
facet,以及数字域的区间facet,不支持数字类型的facet

Solr当前facet统计可以设置丰富的各种参数,基于遍历的,性能有瓶颈再大数据量上。性能的提升严重依赖cache的配置,但是jvm下垃圾回收又是问题。

4.扩展与优化


已经支持
单层facet

Query=q&facet=on&facet.field=fieldA,fieldB


不支持
双层或者混合facet

Query=q1,q2&facet=on&facet.field=fieldsA,fieldB


或者

Query=q1&facet=on&facet.field=fieldAAnother
query=q2&facet=on&facet.field=field2


针对有
规律的请求

Bean请求队列会,返回也队列化


Id

查询,不需要相关性计算,去得分


Rows
start
都设为
0,只获取facet信息


Sort=idasc

自然顺序

只扫描单次的,
filterquery可以不开启


转自:http://aliapp.blog.51cto.com/8192229/1325808

相关问答

更多
  • 你也可以检查下面: - SolrPerformanceFactors ImproveSearchingSpeed ImproveIndexingSpeed SolrCaching 在-七致命-罪-OF-的Solr You can also check below :- SolrPerformanceFactors ImproveSearchingSpeed ImproveIndexingSpeed SolrCaching the-seven-deadly-sins-of-solr
  • 我无法通过Solr或插件配置找到这样做的方法,所以我开发了一种方法来有效地创建组构面计数,同时仍然使用CollapsingQParserPlugin。 我这样做是通过复制我将要面对的字段并确保整个组的所有方面值都在每个文档中,如下所示: "docs": [ { "id": "1", "workId": "abc", "type": "book", "facetType": [ "book", "ebook" ] }, { " ...
  • 如果您要进行查询 - 请执行查询。 Lucene针对查询进行了高度优化,因此您应该这样做。 facet查询用于从任意查询创建构面(计数) - 因此在内部它执行相同的操作。 如果你生成一个facet然后遍历那个facet,那么Lucene必须查看的文档比你查询单个值时要多得多。 获得性能提升的最佳策略是批量执行这些操作 - 检查同一批次中的500本书(即isbn:(123 OR 321 OR 567 OR 765) ),然后在代码中处理。 如果这些更新可以并行地从许多系统到达,而不需要通过单一来源,那么您必须 ...
  • 您的问题是要按方面值进行过滤。 一个过滤器,它只限制结果列表,但不限制相应的构面字段。 您正在寻找的是标记过滤器查询 : q=my+main+query&fq={!tag=brandTag}brand%3A"Flipkart"&facet=true&facet.field={!ex=brandTag}brand Your question is about to filter by a facet-value. A filter which does only restrict the resultlis ...
  • 将text_path字段定义更改为仅在索引时间应用PathHierarchyTokenizerFactory(以下示例)。 你的问题是你的查询是由标记器处理的,所以fq = libraries:“/ test / subtest”实际上是针对fq =库进行查询的:(/ test / subtest OR / test)。
  • 这是一个已知问题,并且存在一个问题。 请点击https://issues.apache.org/jira/browse/SOLR-6329 也似乎使用minCount = 0处理过多的文档不必要,并使用太多的内存,这可能会解释崩溃的节点。 检查这个jira https://issues.apache.org/jira/browse/SOLR-11711 This is a known issue and there is a issue open for this. check here https://i ...
  • 您可以使用构面查询而不是构面范围来完成所要求的内容。 尝试这样的事情: facet.query=myDateField:[NOW-11MONTH/MONTH TO NOW-10MONTH/MONTH] facet.query=myDateField:[NOW-10MONTH/MONTH TO NOW-9MONTH/MONTH] facet.query=myDateField:[NOW-9MONTH/MONTH TO NOW-8MONTH/MONTH] ... 等等。 现在你可以完全控制任何一个方面, ...
  • 对于过滤器查询,如果未指定该字段,则查询将在默认字段上起作用。 您可以通过添加debugQuery=on来检查执行的过滤器查询 text:solr100 因此,检查默认字段是否应具有CABERNET术语。 此外,匹配将取决于字段类型,执行的分析以及字段索引与否的位置。 只有索引的字段才能过滤结果。 For the filter queries if the field is not speci ...
  • 无法找到合适的解决方案,但猴子修补它像这样: Post.solr_search do facet(:comments_count) do row('No') { with(:comments_count).less_than 1 } row('Yes') { with(:comments_count).greater_than 0 } end case params[:comments_count] when 'No' with(:comments_coun ...
  • WordDelimiterFilterFactory导致您的下划线被删除。 基于以下内容: 将单词拆分为子词并对子词组执行可选的转换。 默认情况下,使用以下规则将单词拆分为子词: 在字内分隔符上拆分(所有非字母数字字符)。 “Wi-Fi” - >“Wi”,“Fi” ... 根据您如何使用此字段的说明 - “我想要存储的方面是字符串...” 。 我建议您使用下面定义的string fieldType(来自Solr示例),除非您确实需要应用其他分析器。