我使用php for binary documents(fscrawler)实现了elasticsearch。它在默认设置下工作得很好。我可以在文档中搜索我想要的单词,并得到不区分大小写的结果。然而,我现在想做精确匹配,即在当前搜索的顶部,如果查询被括在引号中,我想得到结果,只匹配查询完全…甚至区分大小写。
我的映射如下所示:
"settings": {
"number_of_shards": 1,
"index.mapping.total_fields.limit": 2000,
"analysis": {
"analyzer": {
"fscrawler_path": {
"tokenizer": "fscrawler_path"
}
},
"tokenizer": {
"fscrawler_path": {
"type": "path_hierarchy"
}
}
}
.
.
.
"content": {
"type": "text",
"index": true
},
if ($q2 == '') {
$params = [
'index' => 'trial2',
'body' => [
'query' => [
'match_phrase' => [
'content' => $q
]
]
]
];
$query = $client->search($params);
$data['q'] = $q;
}
对于完全匹配(不起作用):
if ($q2 == '') {
$params = [
'index' => 'trial2',
'body' => [
'query' => [
'filter' =>[
'term' => [
'content' => $q
]
]
]
]
];
$query = $client->search($params);
$data['q'] = $q;
}
内容字段是文档的主体。如何实现内容字段中特定单词或短语的精确匹配?
据我所知,您的content
字段将非常大,因为许多文档可能超过2-3 MB,这是很多单词。
按照前面问题的答案,使用keyword
字段进行精确匹配是没有意义的,我在前面提到使用keyword
。只有当数据结构化时,才应使用关键字
datatype进行精确匹配
我所理解的是,content
字段是非结构化的。在这种情况下,您需要在content
字段上使用空白分析器。
另外,要获得确切的短语匹配,请查看匹配短语查询。
下面是一个示例索引、文档和查询,可以满足您的用例。
PUT mycontent_index
{
"mappings": {
"properties": {
"content":{
"type":"text",
"analyzer": "whitespace" <----- Note this
}
}
}
}
POST mycontent_index/_doc/1
{
"content": """
There is no pain you are receding
A distant ship smoke on the horizon
You are only coming through in waves
Your lips move but I can't hear what you're saying
"""
}
POST mycontent_index/_doc/2
{
"content": """
there is no pain you are receding
a distant ship smoke on the horizon
you are only coming through in waves
your lips move but I can't hear what you're saying
"""
}
POST mycontent_index/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": { <---- Note this for phrase match
"content": "There is no pain"
}
}
]
}
}
}
POST mycontent_index/_search
{
"query": {
"bool": {
"must": [
{
"match": { <---- Use this for token based search
"content": "there"
}
}
]
}
}
}
请注意,您的响应应该是相应的。
要精确匹配一个单词,只需使用一个简单的匹配查询。
请注意,当您不指定任何分析器时,ES默认使用标准分析器,这将导致在将所有令牌存储在倒排索引中之前将它们转换为小写。但是,空白分析器不会将标记转换为小写。因此,there
和there
作为两个不同的标记存储在ES索引中。
我假设您知道分析和分析器的概念,如果不知道,我建议您浏览这些链接,因为这将帮助您更多地了解我所说的内容。
在了解您的需求之后,您不可能在一个字段上应用多个分析器,所以基本上您有两个选择:
选项1:使用多个索引
选项2:在映射中使用多字段,如下所示:
PUT <your_index_name>
{
"mappings":{
"properties":{
"content":{
"type":"text", <--- Field with standard analyzer
"fields":{
"whitespace":{
"type":"text", <--- Field with whitespace
"analyzer":"whitespace"
}
}
}
}
}
}
希望这能有所帮助。
问题内容: 我使用php对二进制文档(fscrawler)实现了elasticsearch。使用默认设置就可以正常工作。我可以在文档中搜索所需的单词,并且得到的结果不区分大小写。但是,我现在要进行精确匹配,即在当前搜索的顶部,如果查询用引号引起来,我想获得仅与查询完全匹配的结果。 我的映射如下所示: 我对文档的查询如下所示: 对于完全匹配(无效): 内容字段是文档的主体。如何在内容字段中实现特定单
我有一个索引(名称:“index1”)指向ElasticSearch中的多个文档。 文档的格式(json)是- 下面是映射- 我在ES查询中哪里做错了?
问题内容: 我正在尝试编写一个NEST查询,该查询应基于完全匹配的字符串返回结果。我已经在网络上进行了研究,并且对使用术语,匹配,匹配短语有一些建议。我已经尝试了所有这些方法,但是搜索返回的结果中包含搜索字符串的一部分。例如,在我的数据库中,我有以下几行电子邮件地址: ter@gmail.com ter@hotmail.com terrance@hotmail.com 无论我是否使用: 要么
问题内容: 我想在一个字段中搜索“ vision”项目,但是通过在DSL中使用match / match_phrace / term,我只得到了“ vision A”,“ vision B”,“ xx版本”,“ vision”等结果。 我想要的是精确匹配“视觉”应该获得最高分,而包含“视觉”的项目应该排在精确匹配之后。排名应该是: 我检查了Elasticsearch匹配精确术语其中识别出将“索引”
问题内容: 所以我有一个字段以以下格式存储值:,例如23 / 2014、24 / 2014、12 / 2015等。 因此,如果将此字段映射为一个,则可以使用术语过滤器进行精确值搜索,如果我在该精确结构中搜索值(类似于1 / 2014、15 / 2014等),则可以正常工作,例如。 因此,使用11 /或/ 2014之类的其他内容进行搜索不会返回匹配。这可以。 但是,如果将字段定义为,则无法使用查询进
问题内容: 我想获取与“ statusCode”不匹配的结果:200 为了匹配字段中的文本,您可以使用 我尝试过这样的事情: 根据:https : //www.elastic.co/guide/zh- CN/elasticsearch/reference/current/query-dsl-bool- query.html 问题答案: 试试这个