GVKun编程网logo

ElasticSearch在字段上进行多次精确搜索没有结果(elasticsearch精确查找)

15

本文将为您提供关于ElasticSearch在字段上进行多次精确搜索没有结果的详细介绍,我们还将为您解释elasticsearch精确查找的相关知识,同时,我们还将为您提供关于Elasticsearc

本文将为您提供关于ElasticSearch在字段上进行多次精确搜索没有结果的详细介绍,我们还将为您解释elasticsearch精确查找的相关知识,同时,我们还将为您提供关于Elasticsearch CentOS6.5下安装ElasticSearch6.2.4+elasticsearch-head+Kibana、Elasticsearch 多匹配所有字段上的精确短语、ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据、elasticsearch在NEST中空格字符后的第一次搜索中没有找到结果的实用信息。

本文目录一览:

ElasticSearch在字段上进行多次精确搜索没有结果(elasticsearch精确查找)

ElasticSearch在字段上进行多次精确搜索没有结果(elasticsearch精确查找)

我为此感到挣扎,我觉得应该可以,但是也许我在做一些愚蠢的事情。搜索:

{   "query":   {     "bool":     {       "must":[         {"match":{"Element.sourceSystem.name":"Source1 Source2"}}       ]  }}

返回Source1和Source2的数据。在下面添加术语搜索,我希望返回仅包含Source1s的第一次搜索的子集。使用第一个查询或单独运行时,不返回任何内容。

{  "query":  {    "bool":    {      "must":[        {"match":{"Element.sourceSystem.name":"Source1 Source2"}},        {"terms":{"Element.sourceSystem.name":["Source1"]}}      ]    }  }}

我知道很难看到这些文档,但是可以说“ Element.sourceSystem.name”存在并且可以使用,因为第一个搜索可以正常工作-非常感谢所有输入。

答案1

小编典典

match查询中的某些内容与查询中的不同terms

首先,绕道分析仪:

假设您使用的是Elasticsearch
的标准分析器,该分析器由标准标记器和一些标记过滤器组成。标准令牌生成器将在空格,标点符号和其他一些特殊字符上令牌化(将您的文本分成术语)。可以在Elasticsearch文档中找到详细信息,所以现在让我们只说“每个词都是一个术语”。

分析仪的第二个非常重要的部分是小写过滤器。它将把术语变成小写。这意味着以后将搜索Source1source1应产生相同的结果。

举个简短​​的例子:

输入:“这是我用英语输入的文字。” 将被分析并以以下术语结尾:“ this”,“ is”,“ my”,“ input”,“ text”,“ in”,“
english”。

例如,当您将文档编入text字段时,所有这些都会发生。Element.sourceSystem.name由于您的常规匹配查询似乎可以正常运行,因此我假设是这种类型的一种。

现在,当您使用发出匹配查询时"Source1Source2",也将进行分析并将其转换为令牌source1source2。然后,它将在内部在布尔OR中创建2个术语查询。所以,无论是source1source2必须匹配是你查询的结果。

顺便说一句,匹配查询支持一个minimum_should_match属性。您可以指定匹配查询中需要匹配多少个字词。

现在是有关字词查询的线索。它
分析你所提供的文本。通常应该在type字段上使用它keyword。关键字字段也不会进行分析(有关更多信息,请阅读映射类型的文档-实际上非常重要)。那么这是什么意思?

  • 如果我以上面的示例为例,则索引将包含"this", "is", "my", "input", "text", "in", "english"
  • 匹配查询English将匹配,因为它将被分析为english
  • 的字词查询English永远不会匹配,因为English索引中没有字词。区分大小写。

我非常肯定,如果您要source1在术语查询中使用它,那么它将匹配某些内容。但是,我高度怀疑您的查询是否适合您的用例。在查询文本字段时尝试使用普通匹配查询,并且(通常-
并非始终适用)仅在关键字字段上使用字词查询。

Elasticsearch CentOS6.5下安装ElasticSearch6.2.4+elasticsearch-head+Kibana

Elasticsearch CentOS6.5下安装ElasticSearch6.2.4+elasticsearch-head+Kibana

CentOS6.5下安装ElasticSearch6.2.4
(1)配置JDK环境

配置环境变量

export JAVA_HOME="/opt/jdk1.8.0_144"

export PATH="$JAVA_HOME/bin:$PATH"

export CLASSPATH=".:$JAVA_HOME/lib"

(2)安装ElasticSearch6.2.4

下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-4

启动报错:

 

解决方式:


bin/elasticsearch -Des.insecure.allow.root=true


 

或者修改bin/elasticsearch,加上ES_JAVA_OPTS属性:

 


ES_JAVA_OPTS="-Des.insecure.allow.root=true"


 

再次启动:

这是出于系统安全考虑设置的条件。由于ElasticSearch可以接收用户输入的脚本并且执行,为了系统安全考 虑,建议创建一个单独的用户用来运行ElasticSearch。

如果没有普通用户就要创建一个普通用户组和普通用户,下面介绍一下怎么创建用户组和普通用户

创建用户组和用户:

 


groupadd esgroup

useradd esuser -g esgroup -p espassword


 

更改elasticsearch文件夹及内部文件的所属用户及组:

 


cd /opt

chown -R esuser:esgroup elasticsearch-6.2.4


 

切换用户并运行:

su esuser

./bin/elasticsearch

再次启动显示已杀死:

 

需要调整JVM的内存大小:

vi bin/elasticsearch

ES_JAVA_OPTS="-Xms512m -Xmx512m"

再次启动:启动成功

如果显示如下类似信息:

 


[INFO ][o.e.c.r.a.DiskThresholdMonitor] [ZAds5FP] low disk watermark [85%] exceeded on [ZAds5FPeTY-ZUKjXd7HJKA][ZAds5FP][/opt/elasticsearch-6.2.4/data/nodes/0] free: 1.2gb[14.2%], replicas will not be assigned to this node


 

需要清理磁盘空间。

 


后台运行:./bin/elasticsearch -d

测试连接:curl 127.0.0.1:9200


 

会看到一下JSON数据:


[root@localhost ~]# curl 127.0.0.1:9200
{
"name" : "rBrMTNx",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "-noR5DxFRsyvAFvAzxl07g",
"version" : {
"number" : "5.1.1",
"build_hash" : "5395e21",
"build_date" : "2016-12-06T12:36:15.409Z",
"build_snapshot" : false,
"lucene_version" : "6.3.0"
},
"tagline" : "You Know, for Search"
}



实现远程访问:
需要对config/elasticsearch.yml进行 配置:
network.host: hadoop-001

再次启动报错:Failed to load settings from [elasticsearch.yml]

这个错就是参数的冒号前后没有加空格,加了之后就好,我找了好久这个问题;

后来在一个外国网站找到了这句话.

 

Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ElasticsearchParseException[malformed, expected end of settings but encountered additional content starting at line number: [3], column number: [1]]; nested: ParserException[expected ''<document start>'', but found BlockMappingStart

 in ''reader'', line 3, column 1:

    node.rack : r1

    ^

];

Likely root cause: expected ''<document start>'', but found BlockMappingStart

 in ''reader'', line 3, column 1:

    node.rack : r1

 

这个是行的开头没有加空格,fuck!

Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ScannerException[while scanning a simple key

 in ''reader'', line 11, column 2:

     discovery.zen.ping.unicast.hosts ... 

     ^

 

参数冒号后加空格,或者是数组中间加空格

例如:

# discovery.zen.minimum_master_nodes: 3

 

再次启动

还是报错

max file descriptors [4096] for elasticsearch process is too low

 

处理第一个错误:

vim /etc/security/limits.conf //文件最后加入

esuser soft nofile 65536

esuser hard nofile 65536

esuser soft nproc 4096

esuser hard nproc 4096

 

处理第二个错误:

进入limits.d目录下修改配置文件。

vim /etc/security/limits.d/20-nproc.conf
修改为 esuser soft nproc 4096

 

注意重新登录生效!!!!!!!!

处理第三个错误:

vim /etc/sysctl.conf

vm.max_map_count=655360

执行以下命令生效:
sysctl -p

关闭防火墙:systemctl stop firewalld.service

启动又又又报错

 

system call filters failed to install; check the logs and fix your configuration or disable sys

 

直接在

config/elasticsearch.yml  末尾加上一句


bootstrap.system_call_filter: false

再次启动成功!

 


安装Head插件


Head是elasticsearch的集群管理工具,可以用于数据的浏览和查询

(1)elasticsearch-head是一款开源软件,被托管在github上面,所以如果我们要使用它,必须先安装git,通过git获取elasticsearch-head

(2)运行elasticsearch-head会用到grunt,而grunt需要npm包管理器,所以nodejs是必须要安装的

nodejs和npm安装:

http://blog.java1234.com/blog/articles/354.html

git安装


yum install -y git


 

 

(3)elasticsearch5.0之后,elasticsearch-head不做为插件放在其plugins目录下了。
使用git拷贝elasticsearch-head到本地

cd ~

git clone git://github.com/mobz/elasticsearch-head.git

(4)安装elasticsearch-head依赖包

[root@localhost local]# npm install -g grunt-cli

[root@localhost _site]# cd /usr/local/elasticsearch-head/

[root@localhost elasticsearch-head]# cnpm install

(5)修改Gruntfile.js

[root@localhost _site]# cd /usr/local/elasticsearch-head/

[root@localhost elasticsearch-head]# vi Gruntfile.js

在connect-->server-->options下面添加:hostname:’*’,允许所有IP可以访问

(6)修改elasticsearch-head默认连接地址
[root@localhost elasticsearch-head]# cd /usr/local/elasticsearch-head/_site/

[root@localhost _site]# vi app.js

将this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";中的localhost修改成你es的服务器地址

(7)配置elasticsearch允许跨域访问

打开elasticsearch的配置文件elasticsearch.yml,在文件末尾追加下面两行代码即可:

http.cors.enabled: true

http.cors.allow-origin: "*"

(8)打开9100端口

[root@localhost elasticsearch-head]# firewall-cmd --zone=public --add-port=9100/tcp --permanent

重启防火墙

[root@localhost elasticsearch-head]# firewall-cmd --reload

(9)启动elasticsearch

(10)启动elasticsearch-head

 


[root@localhost _site]# cd ~/elasticsearch-head/

[root@localhost elasticsearch-head]# node_modules/grunt/bin/grunt server  或者 npm run start


 

(11)访问elasticsearch-head

关闭防火墙:systemctl stop firewalld.service

浏览器输入网址:hadoop-001:9100/

 

 

安装Kibana
Kibana是一个针对Elasticsearch的开源分析及可视化平台,使用Kibana可以查询、查看并与存储在ES索引的数据进行交互操作,使用Kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据

(1)下载Kibana
https://www.elastic.co/downloads/kibana

(2)把下载好的压缩包拷贝到/soft目录下

(3)解压缩,并把解压后的目录移动到/user/local/kibana

(4)编辑kibana配置文件

[root@localhost /]# vi /usr/local/kibana/config/kibana.yml

 

将server.host,elasticsearch.url修改成所在服务器的ip地址

 


 

server.port: 5601 //监听端口

server.host: "hadoo-001" //监听IP地址,建议内网ip

elasticsearch.url: "http:/hadoo-001" //elasticsearch连接kibana的URL,也可以填写192.168.137.188,因为它们是一个集群

 


 

(5)开启5601端口

Kibana的默认端口是5601

开启防火墙:systemctl start firewalld.service

开启5601端口:firewall-cmd --permanent --zone=public --add-port=5601/tcp

重启防火墙:firewall-cmd –reload

(6)启动Kibana

[root@localhost /]# /usr/local/kibana/bin/kibana

浏览器访问:http://192.168.137.188:5601

 

安装中文分词器

一.离线安装

(1)下载中文分词器
https://github.com/medcl/elasticsearch-analysis-ik

下载elasticsearch-analysis-ik-master.zip

(2)解压elasticsearch-analysis-ik-master.zip

unzip elasticsearch-analysis-ik-master.zip

(3)进入elasticsearch-analysis-ik-master,编译源码

mvn clean install -Dmaven.test.skip=true

(4)在es的plugins文件夹下创建目录ik

(5)将编译后生成的elasticsearch-analysis-ik-版本.zip移动到ik下,并解压

(6)解压后的内容移动到ik目录下

二.在线安装

./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip

Elasticsearch 多匹配所有字段上的精确短语

Elasticsearch 多匹配所有字段上的精确短语

添加一个工作示例

索引数据:

{
  "name": "b","user": "john doe is great"
}
{
  "name": "john doe","user": "a"
}
{
  "name": "b","user": "john is doe great"
}

搜索查询:

此查询在所有字段中搜索准确的短语 "john doe"

{
  "query": {
    "multi_match": {
      "query": "john doe","type": "phrase"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "66129712","_type": "_doc","_id": "1","_score": 2.1784627,"_source": {
          "name": "john doe","user": "a"
        }
      },{
        "_index": "66129712","_id": "3","_score": 0.50632054,"_source": {
          "name": "b","user": "john doe is great"
        }
      }
    ]

ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据

ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据

检索出的数据列表按字段匹配的优先顺序

一、举例

比如,发布一篇文章,文章包括基本的字段包括标题、发布时间、点击率、关键字、内容。当在页面中输入“教育”搜索关键词,会检索出指定字段包括“教育”的所有数据,举例:

id         title             keyword                   content
 1          纳税       继续教育,赡养父母,房屋贷款            教育,子女
 2          上学         义务教育                      好好学习天天向上
 3          毕业         好好工作好好学习                  结束教育教育

有以上三条数据,如果按照默认的ES检索机制,会按照最多匹配的优先级,比如,id为1的keyword和content字段都包括教育关键字,id为1的会排在最前面,同时id为2和3的,id3更有匹配度,包括两个教育关键字,可能ES给检出的数据排序为1、3、2(这里只是猜测,懒得动手了)

二、需求

在公司需求中有这么一个要求,首先,检索数据会先检索出关键字(keyword)的数据,点击加载更多按钮,再检索关键字(keyword)和内容(content)同时包括的数据,并且匹配关键字的优先展示在前面。 

如果不了解ES强大的童鞋可能会在检索出所有数据的时候然后再把数据处理一遍。BUT,ES的排序机制是很强大的,我在根据公司产品需求搜了各种相关的帖子,一边了解一边实践,最终走通了产品需求想要的效果。

三、代码

 

$query = new \Elastica\Query();
$MultiMatch_obj = new \Elastica\Query\MultiMatch();
$MultiMatch_obj->setQuery($keyword); 
if ($search_type == ''default'') { 
    //这里是首先默认加载匹配关键字的列表 
    $MultiMatch_obj->setFields(array(''keywords'')); 
} else { 
    //点击加载更多匹配出包括关键字和内容的列表 
    $MultiMatch_obj->setTieBreaker(0.3); 
    //设定Breaker 
    $MultiMatch_obj->setType(''best_fields''); 
    //开启best_fields 
    $MultiMatch_obj->setFields(array(''keywords^901209'',''content'')); 
    //要优先的keywords 加一个^,后面还跟一个数字(数字随便写的,我觉得比content大就可以了,content应该也是可以跟^数字的 $MultiMatch_obj->setOperator(''or''); 
    $MultiMatch_obj->setMinimumShouldMatch(''30%''); //这里还需要设定  
} 
$query->setQuery($MultiMatch_obj); //命中全部纪录

 

四、参考

https://www.cnblogs.com/bonelee/p/6827068.html
https://www.cnblogs.com/clonen/p/6674922.html

https://www.cnblogs.com/yjf512/p/4897294.html

五、手册

Elasticsearch权威指南(中文版)

 

解决ES搜索拼音字母的一部分搜不到数据

问题通:https://elasticsearch.cn/question/5418

         $Wildcard_query1 = new \Elastica\Query\Wildcard(''keywords'',"*". $keyword."*");
            $Wildcard_query2 = new \Elastica\Query\Wildcard(''title'',"*". $keyword."*");
            $Wildcard_query3 = new \Elastica\Query\Wildcard(''content'',"*". $keyword."*");
            $query->addShould($Wildcard_query1)->addShould($Wildcard_query2)->addShould($Wildcard_query3);

 

 

 

 

elasticsearch在NEST中空格字符后的第一次搜索中没有找到结果

elasticsearch在NEST中空格字符后的第一次搜索中没有找到结果

如何解决elasticsearch在NEST中空格字符后的第一次搜索中没有找到结果?

我在弹性搜索中建立索引,我在下面分享。但是在我进行索引过程后,当我在自动完成中搜索时,它会在空格之前找到我搜索的文本,但是我在空格字符之后按下的第一个键不执行搜索操作。当我输入第二个或第三个字符时,它会返回结果。 如何用空格字符后按的第一个字符进行搜索操作?

我将数据添加到elasticsearch以索引的代码。

 var createIndexDescriptor = new CreateIndexDescriptor(INDEX_NAME).Mappings(ms => ms.Map<GlobalCompany>(m => m.AutoMap()
                  
                    .Properties(pprops => pprops
                        .Text(ps => ps
                            .Name("Title")
                            .Analyzer("whitespace")
                            .Fielddata(true)
                            .Fields(f => f
                                .Keyword(k => k
                                    .Name("keyword")
                                )
                            )
                        )
                    )
        ));

我从elasticsearch中索引的数据中搜索的代码。

var searchResponse = eClient.Search<GlobalCompany>(s => s.Index(INDEX_NAME)
                  .Query(q => q
                  .MultiMatch(m => m
                            .Fields(f => f
                             .Field(u => u.Title)
                             .Field(u => u.RegisterNumber))
                            .Type(TextQueryType.PhrasePrefix)
                          .Query(value))));

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

关于ElasticSearch在字段上进行多次精确搜索没有结果elasticsearch精确查找的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Elasticsearch CentOS6.5下安装ElasticSearch6.2.4+elasticsearch-head+Kibana、Elasticsearch 多匹配所有字段上的精确短语、ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据、elasticsearch在NEST中空格字符后的第一次搜索中没有找到结果的相关知识,请在本站寻找。

本文标签: