- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 ElasticSearch v1.7.2 和相当大的索引,我得到了以下两个搜索的不同文档计数,它们在 query_string 中使用模糊搜索。
查询:
{
"query": {
"query_string": {
"query": "rapt~4"
}
}
}
过滤器:
{
"filter": {
"query": {
"query_string": {
"query": "rapt~4"
}
}
}
}
过滤器给出的结果比查询多大约 5%。为什么文档计数会不同?是否有我可以指定的选项来使它们保持一致?
请注意,这种不一致只会在我使用中等大小的数据集时发生。我已尝试将几个 (<10) 个匹配过滤器但不匹配查询的文档插入到一个干净的集群中,之后我的查询和过滤器都成功地确实匹配了所有文档。但是,在单个索引、单个类型和数百个文档的集群中,我开始看到差异。
使用 explain=true 选项,query 分数似乎是使用 Practical Scoring Function 计算的.该解释提供了有关提升、queryNorm、idf 和术语权重的信息。相比之下,filter 解释仅报告 Practical Scoring Function 的 boost 和 queryNorm 组件,而不是 idf 或 term weights。
下面是带有解释的回复示例。请注意,我已经从我的示例命中中删除了许多字段并简化了内容,因此除了匹配的词(在本例中为“事实”)之外,解释中的术语频率将与实际内容不匹配。这些响应是针对相同 事件的。我的问题是过滤器响应中包含了查询响应中未包含的其他匹配项。他们的解释看起来完全相同。
查询:
curl -XPOST "http://localhost:9200/index-name/example-type/_search" -H "Content-Type: application/json" -d'{"query":{"query_string":{"query":"rapt~"}},"explain":true}'
和查询响应:
{
"_source": {
"type": "example",
"content": "to the fact that"
},
"_explanation": {
"value": 0.10740301,
"description": "sum of:",
"details": [
{
"value": 0.10740301,
"description": "weight(_all:fact^0.5 in 465) [PerFieldSimilarity], result of:",
"details": [
{
"value": 0.10740301,
"description": "score(doc=465,freq=2.0), product of:",
"details": [
{
"value": 0.11091774,
"description": "queryWeight, product of:",
"details": [
{
"value": 0.5,
"description": "boost"
},
{
"value": 7.303468,
"description": "idf(docFreq=68, maxDocs=37706)"
},
{
"value": 0.03037399,
"description": "queryNorm"
}
]
},
{
"value": 0.96831226,
"description": "fieldWeight in 465, product of:",
"details": [
{
"value": 1.4142135,
"description": "tf(freq=2.0), with freq of:",
"details": [
{
"value": 2,
"description": "termFreq=2.0"
}
]
},
{
"value": 7.303468,
"description": "idf(docFreq=68, maxDocs=37706)"
},
{
"value": 0.09375,
"description": "fieldNorm(doc=465)"
}
]
}
]
}
]
}
]
}
}
过滤器:
curl -XPOST "http://localhost:9200/index-name/example-type/_search" -H "Content-Type: application/json" -d'{"query":{"filtered":{"filter":{"fquery":{"query":{"query_string":{"query":"rapt~"}}}}}},"explain":true}'
并过滤响应:
{
"_source": {
"type": "example",
"content": "to the fact that"
},
"_explanation": {
"value": 1,
"description": "ConstantScore(cache(+_type:example-type +org.elasticsearch.index.search.nested.NonNestedDocsFilter@737a6633)), product of:",
"details": [
{
"value": 1,
"description": "boost"
},
{
"value": 1,
"description": "queryNorm"
}
]
}
}
当我将过滤器包装在一个常量分数查询中时,我得到了与过滤器完全相同的一组结果(同样,多于查询),但解释看起来更清晰:
恒定分数查询包装过滤器:
curl -XPOST "http://localhost:9200/index-name/example-type/_search" -H "Content-Type: application/json" -d'{"query":{"constant_score":{"filter":{"query":{"query_string":{"query":"rapt~"}}}}},"explain":true}'
和常量分数查询包装过滤器响应:
{
"_source": {
"type": "example",
"content": "to the fact that"
},
"_explanation": {
"value": 1,
"description": "ConstantScore(QueryWrapperFilter(_all:rapt~2)), product of:",
"details": [
{
"value": 1,
"description": "boost"
},
{
"value": 1,
"description": "queryNorm"
}
]
}
}
因为过滤器返回的结果比查询更多,我的猜测是实用评分函数最终对与查询匹配的文档评分为 0。但是,对于“匹配"查询,评分函数的任何组成部分都不应为零。
编辑:我在一个由 238 个文档组成的小集群上重新创建了这个问题(请注意,文档的内容是从在维基百科文本上训练的 ngram 语言模型生成的。)。我已经发布了 cluster和 json events在保管箱上。要查看此数据的问题,请运行以下查询,它返回 id=138 的事件:
{
"explain": true,
"query": {
"bool": {
"must_not": [
{
"query_string": {
"query": "rap~",
"fields": [
"body"
]
}
}
],
"must": [
{
"constant_score": {
"filter": {
"query": {
"query_string": {
"query": "rap~",
"fields": [
"body"
]
}
}
}
}
}
]
}
}
}
最佳答案
在 Elasticsearch 之前 Elasticsearch 5.x 版本中,顶层的filter
表示post_filter
.后过滤器通常仅在使用聚合时才相关。
从 Elasticsearch 5.0(及更高版本)开始,您必须明确说明 post_filter
以避免这种混淆。
因此,不同之处在于您的热门查询实际上将结果限制为一组匹配文档。后过滤器有效地匹配所有内容,然后仅从命中中删除结果而不影响计数。
...it appears that the query score is computed using...
查询总是计算分数,它们旨在帮助根据项目的相关性(分数)对项目进行正确排序。过滤器从不计算分数;过滤器用于纯 bool 逻辑,不影响包含/排除之外的“相关性”。
公平地说,您可以在 Elasticsearch 1.x 中以多种方式将任何查询转换为过滤器(在 2.x 中,所有查询在正确的上下文中也是过滤器!),但我倾向于使用 fquery
。如果你这样做,那么你应该得到相同的结果:
作为查询:
{
"query": {
"query_string": {
"query": "rapt~"
}
}
}
作为过滤器:
{
"query": {
"filtered": {
"filter": {
"fquery": {
"query": {
"query_string": {
"query": "rapt~"
}
}
}
}
}
}
}
在 ES 2.x 中,过滤器也简化了(并且查询没有改变):
{
"query": {
"bool": {
"filter": {
"query_string": {
"query": "rapt~"
}
}
}
}
}
关于使用 lucene 模糊运算符时,Elasticsearch 查询和过滤器会给出不同的文档计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34635815/
Lucene 对俄语的支持很差。 RussianAnalyzer(lucene-contrib 的一部分)质量非常低。 Snowball 的 RussianStemmer 模块更糟糕。它不识别 Uni
我需要使用 Lucene 对 Books 数据库进行多字段级别搜索。 例如:我的搜索条件类似于: (Author:a1 and title:t1) OR (Author:a2 and title:t
在搜索一堆文档时,我可以轻松找到符合我的搜索条件的文档数量: Hits hits = Searcher.Search(query); int DocumentCount = hits.Length()
我正在向 Lucene 索引添加数十亿行,每行几乎是 6000 字节。可以添加到 Lucene 索引的最大行数是否有限制? Lucene 索引上 6000 字节的十亿行将占用多少空间。这个尺寸有限制吗
如果我编写使用 Lucene 执行搜索的算法,我该如何说明它的计算复杂度?我知道 Lucene 使用 tf*idf 评分,但我不知道它是如何实现的。我发现 tf*idf 具有以下复杂性: O(|D|+
我想在索引中搜索特殊字符。 我转义了查询字符串中的所有特殊字符,但是当我在索引中的 lucene 上执行查询为 + 时,它会创建查询为 +()。 因此它不搜索任何字段。 如何解决这个问题呢?我的索引包
我不明白它们是什么,我真的很感激一个简单的解释,展示它们给世界带来的值(value),而没有太多关于它们如何工作的实现细节。 最佳答案 范数是计算分数的一部分。可以根据您的喜好计算标准,真的。使规范与
这可以被视为一般 Java 问题,但为了更好地理解,我使用 Lucene 作为示例。 您可以在 Lucene 中使用不同的分词器来分词文本。有主要的抽象 Tokenizer 类,然后是许多扩展它的不同
我必须索引应该一起搜索的不同类型的数据(文本文档、论坛消息、用户配置文件数据等)(即,单个搜索将返回不同类型数据的结果)。 拥有多个索引(每种类型的数据一个)的优缺点是什么? 以及对各种数据使用单一索
我使用Lucene.Net为一些文档建立索引。我想向用户展示几行有关为什么该文档出现在结果集中的信息。就像您使用Google进行搜索一样,它会显示链接,然后是链接,其中有几行带有突出显示的关键字。 有
Lucene 中的段是什么? 分段有什么好处? 最佳答案 Lucene 索引被分割成更小的 block ,称为段。每个段都有自己的索引。 Lucene 按顺序搜索所有这些。 当新的写入器打开以及写入器
我想了解 lucene 搜索如何运行得如此之快。我在网上找不到任何有用的文档。如果您有任何内容(除了 lucene 源代码)需要阅读,请告诉我。 在我的例子中,使用带索引的 mysql5 文本搜索进行
有人可以解释一下 Lucene 中不同分析器之间的区别吗?我收到 maxClauseCount 异常,我知道可以通过使用 KeywordAnalyzer 来避免这种情况,但我不想在不了解分析器周围问题
显然它不能用来破坏索引或破解卡号、密码等(除非有人愚蠢到将卡号或密码放入索引中)。 是否有可能因过于复杂的搜索而导致服务器瘫痪? 我想我真正需要知道的是我是否可以将用户输入的 Lucene 查询直
我已经索引了 400 个文档。然后我想给两个文档和 lucene 返回这两个文档之间的相似度。那可能吗?提前致谢。 最佳答案 简而言之。计算两个文档向量的余弦。 example code 关于luce
我正在考虑/致力于为我们公司的各种内容类型实现一个搜索引擎,并尝试着迷于 Lucene(特别是 .net 风格)。 目前,我的主要问题是索引的文档是否必须包含相同的字段。 例如: 文档1: 标题:“我
我对 Lucene 的评分功能有一个问题,我无法弄清楚。到目前为止,我已经能够编写这段代码来重现它。 package lucenebug; import java.util.Arrays; impor
我需要建立该矩阵,但找不到用于为每个单元格计算归一化tf-idf的方法。 我要执行的归一化是余弦归一化,将tf-idf(使用DefaultSimilarity计算)除以1 / sqrt(列中的sumO
有意义吗? 对于我的客户来说,开发克罗地亚语分析器太昂贵了,我没有找到任何现有的分析器...所以我的问题是...我是否告诉他们放弃使用 Lucene 来处理克罗地亚语内容的想法? 谢谢! 最佳答案 S
频繁更新 lucene 索引(每隔几秒)可以吗?更新将同样是添加,更新和搜索将同时发生。 最佳答案 我将在这个答案前面加上“我只使用过 Java Lucene”,但这应该仍然适用:从一般意义上讲,按照
我是一名优秀的程序员,十分优秀!