Elasticsearch查询字符串与匹配短语组合
我认为最好是描述我的意图,并尝试将其分解为代码Elasticsearch查询字符串与匹配短语组合,search,
elasticsearch,lucene,full-text-search,Search,
elasticsearch,Lucene,Full Text Search,我认为最好是描述我的意图,并尝试将其分解为代码 我希望用户能够在选择query\u字符串时进行复杂查询。例如“AND”和“OR”和“~”等 我想让模糊性生效,这让我做了一些让我感到肮脏的事情,比如“#{query}~”发送到ES,换句话说,我代表用户指定模糊查询,因为我们提供的音译可能很难获得准确的拼写 有时,用户搜索一个短语中的许多单词查询字符串单独搜索,而不是作为短语搜索。例如,当这三个词按顺序排列时,“他将”应该给我带来最热门的比赛,然后再给我任何东西 当前查询: { "indices
query\u字符串时进行复杂查询。例如“AND”和“OR”和“~”等
{
"indices_boost": {},
"aggregations": {
"by_ayah_key": {
"terms": {
"field": "ayah.ayah_key",
"size": 6236,
"order": {
"average_score": "desc"
}
},
"aggregations": {
"match": {
"top_hits": {
"highlight": {
"fields": {
"text": {
"type": "fvh",
"matched_fields": [
"text.root",
"text.stem_clean",
"text.lemma_clean",
"text.stemmed",
"text"
],
"number_of_fragments": 0
}
},
"tags_schema": "styled"
},
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"_source": {
"include": [
"text",
"resource.*",
"language.*"
]
},
"size": 5
}
},
"average_score": {
"avg": {
"script": "_score"
}
}
}
}
},
"from": 0,
"size": 0,
"_source": [
"text",
"resource.*",
"language.*"
],
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "inna alatheena",
"fuzziness": 1,
"fields": [
"text^1.6",
"text.stemmed"
],
"minimum_should_match": "85%"
}
}
],
"should": [
{
"match": {
"text": {
"query": "inna alatheena",
"type": "phrase"
}
}
}
]
}
}
}
注意:alatheena
在没有~
的情况下搜索不会返回任何内容,尽管我在索引中有alatheena
。所以我必须做一个模糊搜索
有什么想法吗?你应该用它来实现
一种查询,用于生成由其
子查询,并为每个文档的
由任何子查询生成的文档,加上一个中断连接
任何其他匹配子查询的增量
这在使用搜索多个字段中的单词时非常有用
不同的增压系数(因此不能组合磁场
等效为单个搜索字段)。我们想让初选的分数
是与最高增压相关联的
如何使用它的快速示例:
POST /_search
{
"query": {
"dis_max": {
"tie_breaker": 0.7,
"boost": 1.2,
"queries": [
{
"match": {
"text": {
"query": "inna alatheena",
"type": "phrase",
"boost": 5
}
}
},
{
"match": {
"text": {
"query": "inna alatheena",
"type": "phrase",
"fuzziness": "AUTO",
"boost": 3
}
}
},
{
"query_string": {
"default_field": "text",
"query": "inna alatheena"
}
}
]
}
}
}
它将运行您的所有查询,并且将采用与其他查询相比得分最高的查询。因此,只需使用它定义您的规则。你应该实现你想要的。我看到你在做古兰经经文的索引,+1 如果我理解正确的话,您的许多问题域都可以通过在Aayah文档的一个单独字段中存储大量的音译变体(及其组合的排列)来解决 首先,您应该制作一个字符过滤器,将所有双字母替换为单字母
[aa]=>[a]
,[ll]=>[l]
也可以将包含所有[a,e,i]
的单独字段(因为它们的“呼应性”//transcribal歧义性)替换为€
或类似内容,并在查询时执行相同操作,以获得尽可能多的匹配项
此外,“Allateena”中的TH(作为脚注,可能真的是Dhaal、Thaa、Zhaa、Taa+Haa、Taa+Hhaa、Ttaa+Hhaa转录…)应该被某个东西取代,或者Dhaal和Thaa都应该被转录多次
然后,因为它是古兰经的脚本,所有不带变音符号的Alef、Hamza、Madda等都应该被视为Alef(或Hamzat)ul-Wasl,在索引/搜索时也应该考虑到这一点,因为阿拉伯语中的Waqf/Wasl。(以苏拉特阿拉克省第一个阿雅省的所有Wasl为例)
不知道这是否以任何方式回答了您的问题,但我希望这对实现您的应用程序有帮助。这太棒了!今晚我想试试这个,让你知道效果如何。还有一个问题,match_短语查询不支持模糊性,我如何才能使其实现?例如,它不会返回任何带有“inna alatheena”的内容,因为它实际上是“inna allatheena”@MohamedElMahallawy,你是对的。模糊查询不适用于短语查询。我所能想到的就是使用char_过滤器将ll规范化为l。或者更好,使用启用功能。不知道这算不算自我提升(但这是一个利基领域,谁在乎呢),以下是我在同一个问题领域所做的一些工作: