我需要在Solr中执行在线搜索,即用户需要找到具有特定标准的在线用户列表.
我如何处理这个问题:我们将用户的ID存储在一个表中,并在Solr请求中发送所有在线用户ID
&fq=-id:(id1 id2 id3 ............id5000)
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,当id变大时,Solr需要花费太多时间来解决,我们需要通过网络传输大量请求.
一种解决方案可以是在Solr中使用join,但是在线数据会定期更改,我不能每次都对数据进行索引(例如5-10分钟,应该至少一小时).
其他解决方案我认为根据URL中的某些参数从Solr内部触发此查询.我对Solr内部结构不太了解,所以不知道如何继续.
我在使用Solr4中的dataImportHandler生成UUID时遇到问题.我试图从现有的MySQL数据库导入.
我的schema.xml包含:
<fields>
<field name="uuid" type="uuid" indexed="true" stored="true" required="true" />
<field name="id" type="string" indexed="true" stored="true" required="true"/>
<field name="address" type="text_general" indexed="true" stored="true"/>
<field name="city" type="text_general" indexed="true" stored="true" />
<field name="county" type="string" indexed="true" stored="true" />
<field name="lat" type="text_general" indexed="true" stored="true" />
<field name="lng" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
<field name="price" type="float" indexed="true" stored="true"/>
<field name="bedrooms" type="float" indexed="true" stored="true" />
<field name="image" type="string" indexed="true" stored="true"/>
<field name="region" type="location_rpt" indexed="true" stored="true" />
<defaultSearchField>address</defaultSearchField>
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="text" type="text_general" indexed="true" …Run Code Online (Sandbox Code Playgroud) 这是我试图实现的代码:-
import requests
import tornado.ioloop
import tornado.web
import tornado.autoreload
import json
class MainHandler(tornado.web.RequestHandler):
def get(self):
payload = [{"id" : "978-0641723445", "cat" : ["book","hardcover"], "name" : "The Lightning Thief", "author" : "Rick Riordan","series_t" : "Percy Jackson Olympians", "sequence_i" : 1, "genre_s" : "fantasy", "inStock" : True, "price" : 12.50, "pages_i" : 384}]
url = 'http://localhost:8983/solr/update/json'
headers = {'content-type' : 'application/json'}
# files = {'file': ('books.json', open('books.json', 'rb'))}
timeline = requests.post(url, data = json.dumps(payload), headers = headers)
self.write(timeline.text)
class QueryHandler(tornado.web.RequestHandler):
def get(self): …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助来决定在单个Solr实例中创建单个索引与在单个Solr实例中创建多个核心,每个核心为索引提供服务.我的理解是,solr中的单个索引通常用于索引一种类型的文档.当您有不同的文档类型时,最佳做法是什么?例如,如果要索引发票交易的详细信息,可以创建一个包含发票交易凭证字段的模式,如下所示;
假设您还要索引产品的详细信息,是否可以使用以下模式创建新的文档类型;
并在Solr中创建一个新核心来索引产品文档?或者您将事务和产品合并到一个模式中,如下所示;
只有一个核心索引上述doucment,而不是有一个"Invoice"核心和一个"产品"核心索引两个不同的文件?
我认为当字段类似时,在Solr wiki中建议使用单个平坦索引是有意义的,但是在上面的示例中,数据甚至彼此之间没有远程相关,因为它们是独立的实体.我见过人们建议添加额外字段以区分不同实体(如表名字段或类似字段)的情况,并根据表名字段过滤查询,我猜这种情况有用.虽然当你有一个如下用例时,我不确定它的可扩展性有多远;
"搜索关键字'John'的发票,要搜索的字段是'billingContact','invoiceSummary','notes'.在查询时提升'billingContact'字段.还搜索产品'John',要搜索的字段是' productDescription','supplier','notes'.在查询时提升'供应商'.仅返回100个发票和100个产品."
我正在处理的应用程序需要从单个表单中搜索发票和产品.应用程序中没有不同的部分可以搜索不同的内容.
我把所有东西放在一个索引中的担忧;
1)指数大,例如:5000万张发票+ 5000万单一指数产品
2)重新索引该大小的索引.
3)索引调整:调整/调整每个单独的索引以提供特定的预期搜索结果,而不是尝试在单个索引中执行此操作不是更容易吗?
4)我们决定将来也会对结算联系方式进行索引.这将添加更多要编入索引的字段,并在第1)和第2点中对我的关注做出贡献.
当我使用分组结果进行搜索并执行组限制时,我得到的numFound与我不使用限制时的相同.
看起来SOLR首先执行搜索并计算numFound然后限制结果.
我不能使用分页和其他东西.是否有任何解决方法或我错过了什么?
例:
======================================
| id | publisher | book_title |
======================================
| 1 | A1 | Title Book |
| 2 | A1 | Book title 123 |
| 3 | A1 | My book |
| 4 | B2 | Hi book title |
| 5 | B2 | Another Book |
Run Code Online (Sandbox Code Playgroud)
如果我执行查询:
q=book_title:book
&group=true
&group.field=publisher
&group.limit=1
&group.main=true
Run Code Online (Sandbox Code Playgroud)
我会得到numFound 5但结果只有2.
"response": {
"numFound": 5,
"docs": [
{
"book_title": "My book",
"publisher": …Run Code Online (Sandbox Code Playgroud) 我的(网络)应用程序中有以下工作流程:
我的问题是索引文件后,它仍然被锁定,删除部分抛出异常.
这是我的索引文件的代码片段:
try
{
ContentStreamUpdateRequest req = new ContentStreamUpdateRequest("/update/extract");
req.addFile(file, type);
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
NamedList<Object> result = server.request(req);
Assert.assertEquals(0, ((NamedList<?>) result.get("responseHeader")).get("status"));
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
编辑:
我也尝试过这种方式,但结果相同......
ContentStream contentStream = null;
try
{
contentStream = new ContentStreamBase.FileStream(document);
ContentStreamUpdateRequest req = new ContentStreamUpdateRequest(UPDATE_EXTRACT_REQUEST);
// req.addFile(document, context.getProperty(FTSConstants.CONTENT_TYPE_APPLICATION_PDF));
req.addContentStream(contentStream);
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
NamedList<Object> result = server.request(req);
if (!((NamedList<?>) result.get("responseHeader")).get("status").equals(0))
{
throw new IDSystemException(LOG, "Document could not be indexed. Status returned: " +
((NamedList<?>) result.get("responseHeader")).get("status"));
}
}
catch (FileNotFoundException fnfe)
{
throw …Run Code Online (Sandbox Code Playgroud) 我在如何构建Solr查询或如何设置模式以使我们的网上商店中的搜索更好地工作方面遇到了一些困难.
首先是一些配置(Solr 4.2.1)
<field name="mfgpartno" type="text_en_splitting_tight" indexed="true" stored="true" />
<field name="mfgpartno_sort" type="string" indexed="true" stored="false" />
<field name="mfgpartno_search" type="sku_partial" indexed="true" stored="true" />
<copyField source="mfgpartno" dest="mfgpartno_sort" />
<copyField source="mfgpartno" dest="mfgpartno_search" />
<fieldType name="sku_partial" class="solr.TextField" omitTermFreqAndPositions="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
<filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="100" side="front" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
</analyzer> …Run Code Online (Sandbox Code Playgroud) 我正在使用Solr 7.4.0并使用DIH方法索引数据.
在data-config.xml中查询.
<entity name="Test" query="Select Names,Test_Value1,Test_Value2,Test_Value3 from TestTable">
<field column="Names" name="Names" splitBy="," />
<field column="Test_*" name="Test_*" splitBy="," />
</entity>
Run Code Online (Sandbox Code Playgroud)
Schema.xml的
<field name="Names" type="string" multiValued="true" indexed="true" />
<dynamicField name="Test_*" type="string" multiValued="true" indexed="true" />
Run Code Online (Sandbox Code Playgroud)
完成索引后,名称可轻松分离如下,并根据需要将值显示为multiValue.
例如
"Names":["Demo1",
"Demo2"]
Run Code Online (Sandbox Code Playgroud)
但是当使用动态字段作为字符串类型multiValue时.它在索引中显示此结果.
"Test_Value1":["Test 1, Test 2, Test 3"],
Run Code Online (Sandbox Code Playgroud)
但我需要这个结果如下.
"Test_Value1":["Test 1", "Test 2", "Test 3"],
Run Code Online (Sandbox Code Playgroud)
如何分离动态字段值的值,如上所示.
我已经浏览了本网站上的相关问题,但没有找到相关的解决方案.
使用表单的HTTP请求查询我的Solr4索引时
&facet=true&facet.field=country
Run Code Online (Sandbox Code Playgroud)
响应包含所有不同国家/地区以及每个国家/地区的计数.
如何使用SolrJ获取此信息?我尝试过以下方法,但它只返回所有国家/地区的总计数,而不是每个国家:
solrQuery.setFacet(true);
solrQuery.addFacetField("country");
Run Code Online (Sandbox Code Playgroud)
以下似乎有效,但我不想事先明确设置所有分组:
solrQuery.addFacetQuery("country:usa");
solrQuery.addFacetQuery("country:canada");
Run Code Online (Sandbox Code Playgroud)
其次,我不确定如何从QueryResponse对象中提取构面数据.
所以有两个问题:
1)使用SolrJ如何在字段上进行分面并返回分组而不明确指定组?
2)使用SolrJ如何从QueryResponse对象中提取构面数据?
谢谢.
更新:
我也尝试过类似谢尔盖的回应(下图).
List<FacetField> ffList = resp.getFacetFields();
log.info("size of ffList:" + ffList.size());
for(FacetField ff : ffList){
String ffname = ff.getName();
int ffcount = ff.getValueCount();
log.info("ffname:" + ffname + "|ffcount:" + ffcount);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码显示了大小= 1的ffList,循环经历了1次迭代.在输出ffname ="country"中,ffcount是与原始查询匹配的总行数.
这里没有每个国家的细分.
我应该提一下,在同一个solrQuery对象上,我也调用了addField和addFilterQuery.不确定这是否会影响到分面:
solrQuery.addField("user-name");
solrQuery.addField("user-bio");
solrQuery.addField("country");
solrQuery.addFilterQuery("user-bio:" + "(Apple OR Google OR Facebook)");
Run Code Online (Sandbox Code Playgroud)
更新2:
我想我得到了它,再次基于谢尔盖在下面说的话.我使用FacetField.getValues()提取了List对象.
List<FacetField> fflist = resp.getFacetFields();
for(FacetField ff : fflist){
String ffname = ff.getName();
int ffcount = ff.getValueCount();
List<Count> …Run Code Online (Sandbox Code Playgroud) 我目前正在使用SOLR 4.2来索引地理空间数据(纬度和经度数据).我已将我的地理空间字段配置如下.
<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
<field name="latlong" type="location" indexed="true" stored="false" multiValued="true"/>
Run Code Online (Sandbox Code Playgroud)
我只是想确保我使用正确的SOLR类来执行地理空间搜索,因为我不确定未来版本的SOLR将支持哪个2类(LatLonType与SpatialRecursivePrefixTreeFieldType).
我假设SpatialRecursivePrefixTreeFieldType是latlong的升级版本,有人可以确认我是否正确吗?
solr4 ×10
solr ×8
lucene ×4
dih ×2
solrcloud ×2
solrj ×2
apache ×1
apache-tika ×1
geospatial ×1
java ×1
python-2.7 ×1
search ×1
solrnet ×1
sql-server ×1