- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在一个字段上搜索时,评分似乎没有考虑字段的长度(即文本较长的文档与较短的文档的评分相同,并且出于某种原因放在前面)。不确定我做错了什么。
字段索引如下:
"name": {
"type": "string",
"analyzer": "autocomplete"
},
"_alias": {
"type": "string",
"analyzer": "autocomplete"
}
分析器:
"autocomplete": {
"char_filter": [
"special_character_mapping"
],
"filter": [
"lowercase",
"autocomplete_filter"
],
"tokenizer": "whitespace"
}
过滤器:
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
查询 1:
{
"query": {
"multi_match": {
"query": "brown fo",
"type": "most_fields",
"fields": [
"name",
"_alias"
],
"use_dis_max": true,
"tie_breaker": 1,
"minimum_should_match": "100%",
"analyzer": "standard"
}
}
}
这会返回很多文档,例如:
在第 10 名左右终于有:
更不用说有一份文档(Brown fox tree)排在第 15 位左右,也有一个未考虑的别名“Brown”。
查询 2:
{
"query": {
"multi_match": {
"query": "brown fo",
"type": "cross_fields",
"fields": [
"name",
"_alias"
],
"use_dis_max": true,
"tie_breaker": 1,
"minimum_should_match": "100%",
"analyzer": "standard"
}
}
}
这会返回更好的结果:
第二个和第三个文档的得分总是相同的。第一个的别名是“Brown”,排在最前面。
我尝试了各种 multi_match 类型和 query_string 但结果是一样的。
如何让文本较短的文档(lucene自己做?)排在前面?
最佳答案
由于您的字段 name
和 _alias
已使用 autocomplete
分析器指定(请注意,因为您仅在索引时使用该分析器时间,你应该指定 index_analyzer
而不是 analyzer
),你的输入将是:
所以对于你上面给出的所有输入文本,它是这样的:
棕色狐狸 => b
, br
, bro
, brow
, brown
, browne
, browned
, f
, fo
, 狐狸
棕狐 => b
, br
, bro
, brow
, brown
, browni
, brownis
, brownish
, f
, fo
,狐狸
,狐狸
,狐狸
Browny for => b
, br
, bro
, brow
, brown
、browny
、f
、fo
、for
棕狐 => b
, br
, bro
, brow
, 棕色
、f
、fo
、狐狸
棕狐树 => b
, br
, bro
, brow
, brown
, f
, fo
, fox
, t
, tr
, tre
, 树
现在,当您使用标准
分析器搜索brown fo
时,搜索标记将是:brown
和fo
如您所见,标记 brown
和 fo
出现在上面的所有 搜索词中,因此它们基本上是等价的。唯一会影响评分(以及排序顺序)的是是否在 name
或 _alias
字段(或两者)中找到这些术语以及 type
您正在使用的字段匹配。没有看到具体的文档很难说,但您绝对应该尝试将 ?explain=true
添加到您的查询中,以更深入地了解评分的计算方式。
关于Elasticsearch EdgeNgram 没有首先返回较短的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32253207/
我正在尝试为索引设置一个新的映射。它将支持由 ES 提供支持的部分关键字搜索和自动完成请求。 带有空白标记器的 edgeNGram 标记过滤器似乎是一种可行的方法。到目前为止,我的设置看起来像这样:
当我在一个字段上搜索时,评分似乎没有考虑字段的长度(即文本较长的文档与较短的文档的评分相同,并且出于某种原因放在前面)。不确定我做错了什么。 字段索引如下: "name": { "ty
我有大约一百万条记录的 Elasticsearch 索引。 我想对 Elasticsearch 索引中的2个字段,名称和ID(总共约10个)进行多前缀搜索。 创建EdgeNGram自动完成过滤器是否有
关于 EdgeNgram 如何处理数字有什么想法吗? 我正在使用 ElasticSearch 后端运行 haystack。我创建了一个 EdgeNgram 类型的索引字段。该字段将包含一个字符串,该字
我最近一直在尝试使用 Django Haystack (v2.1.0) 和 Elasticsearch (v0.90.5) 作为我的搜索引擎在我的网络应用程序上实现全文搜索。我的目标是能够通过一个查询
我正在尝试制作 部分搜索 工作,寻找 “sw” “瑞典” “瑞典” 应该匹配“瑞典” 我环顾四周,就是无法让它工作 Rails Code 我正在使用 this code从轮胎 repo 作为模板代码。
我们有一个符合 OData 的 API,可以将部分全文搜索需求委托(delegate)给 Elasticsearch 集群。 由于 OData 表达式可能变得非常复杂,因此我们决定将它们简单地转换为等
当我使用带有 edgengram (min=3, max=7, front) + term_vector=with_positions_offsets 的分析器时 文档有 text = "CouchD
我有一个大约 40k 行的数据集,每行有 4 个字段。现在我想对文本框中的这 4 个字段使用自动完成机制(在显示建议之前必须将这 4 个字段中的值连接成一个字符串)。哪种查询会更好地扩展和执行?在 E
我有一个大约 40k 行的数据集,每行有 4 个字段。现在我想对文本框中的这 4 个字段使用自动完成机制(在显示建议之前必须将这 4 个字段中的值连接成一个字符串)。哪种查询会更好地扩展和执行?在 E
假设我有 5 部电影片名: 无太阳 珊莎 这也是 Solr 古德 唯一幸存者 我想实现一个具有这种预期行为的自动完成搜索字段: “Sans”> Sans Soleil,Sansa “Sans so”
我有三个带有“用户名”字段的文档: '布里安迪利' 'briangumble' 'briangriffen' 当我搜索“brian”时,我按预期得到了所有三个,但是当我搜索“briandilley”时
编辑 3 :我现在使用的解决方法是从我的查询和索引字段中去除除字母、数字和空格以外的任何内容。这会产生所需的行为,但它在很大程度上是一种解决方法而不是真正的解决方案,而且我仍然想了解 Solr 为什么
我是一名优秀的程序员,十分优秀!