读书人

Solr的Scala客户端(scalikesolr)引见

发布时间: 2012-12-19 14:13:14 作者: rapoo

Solr的Scala客户端(scalikesolr)介绍
本文是scalikesolr的wiki的翻译

后边的代码片段使用了如下文档产生的索引"example/exampledocs/books.json".

{
"id" : "978-0641723445",
"cat" : ["book","hardcover"],
"title" : "The Lightning Thief",
"author" : "Rick Riordan",
"series_t" : "Percy Jackson and the Olympians",
"sequence_i" : 1,
"genre_s" : "fantasy",
"inStock" : true,
"price" : 12.50,
"pages_i" : 384
},
{
"id" : "978-1423103349",
"cat" : ["book","paperback"],
"title" : "The Sea of Monsters",
"author" : "Rick Riordan",
"series_t" : "Percy Jackson and the Olympians",
"sequence_i" : 2,
"genre_s" : "fantasy",
"inStock" : true,
"price" : 6.49,
"pages_i" : 304
}

查询

简单查询

使用核心查询参数和普通查询参数:

import com.github.seratch.scalikesolr._val client = Solr.httpServer(new URL("http://localhost:8983/solr")).newClientval request = new QueryRequest(writerType = WriterType.JavaBinary, query = Query("author:Rick")) // faster when using WriterType.JavaBinaryval response = client.doQuery(request)println(response.responseHeader)println(response.response)response.response.documents foreach {  case doc => {    println(doc.get("id").toString()) // "978-1423103349"    println(doc.get("cat").toListOrElse(Nil).toString) // List(book, hardcover)    println(doc.get("title").toString()) // "The Sea of Monsters"    println(doc.get("pages_i").toIntOrElse(0).toString) // 304    println(doc.get("price").toDoubleOrElse(0.0).toString) // 6.49  }}


从SolrDocument绑定到对象

需要无参构造器和字段设置器。也可以指定有一个字符串作为参数的构造器的用户定义类型

case class PageI(val value: String = "")case class Book(  var id: String = "",  var cat: List[String] = Nil,  var price: Double = 0.0,  var pageI: PageI = PageI(),  var sequenceI: Int = 0 ) {  def this() = {    this ("", Nil, 0.0, PageI(), 0)  }}val book = doc.bind(classOf[Book])println(book.id) // "978-1423103349"println(book.cat.size) // 2println(book.price) // 6.49println(book.pageI.value) // 304println(book.sequenceI) // 2


使用高亮

使用高亮参数:

val request = new QueryRequest(  writerType = WriterType.JSON, // but JSON format might be slow...  query = Query("author:Rick"),  sort = Sort("page_i desc"))request.highlighting = HighlightingParams(true)val response = client.doQuery(request)println(response.highlightings)response.highlightings.keys foreach {  case key => {    println(key + " -> " + response.highlightings.get(key).get("author").toString)    // "978-0641723445" -> "[i]Rick[/i] Riordan"  }}


使用MoreLikeThis

使用推荐:

val request = new QueryRequest(Query("author:Rick"))request.moreLikeThis = MoreLikeThisParams(  enabled = true,  count = 3,  fieldsToUseForSimilarity = FieldsToUseForSimilarity("body"))val response = client.doQuery(request)println(response.moreLikeThis)response.response.documents foreach {  doc => {    val id = doc.get("id").toString    response.moreLikeThis.getList(id) foreach {      case recommendation => {        println(recommendation) // "SolrDocument(WriterType(standard),,Map(start -> 0, numFound -> 0))"      }    }  }}


使用多层面查询(FacetQuery)

使用简单的多层面查询参数:

val request = new QueryRequest(Query("author:Rick"))request.facet = new FacetParams(  enabled = true,  params = List(new FacetParam(Param("facet.field"), Value("title"))))val response = client.doQuery(request)println(response.facet.facetFields)response.facet.facetFields.keys foreach {  case key => {    val facets = response.facet.facetFields.getOrElse(key, new SolrDocument())    facets.keys foreach {      case facetKey => println(facetKey + " -> " + facets.get(facetKey).toIntOrElse(0))      // "thief" -> 1, "sea" -> 1, "monster" -> 1, "lightn" -> 1    }  }}


使用结果集分组(Groupiong) /字段折叠(Field Collapsing)

val request = new QueryRequest(Query("genre_s:fantasy"))request.group = new GroupParams(  enabled = true,  field = Field("author_t"))val response = client.doQuery(request)println(response.groups.toString)response.groups.groups foreach {  case group => println(group.groupValue + " -> " + group.documents.toString)  // "r.r" -> List(SolrDocument(...  // "glen" -> List(SolrDocument(...}


分布式查询

使用分布式查询:

val request = new QueryRequest(Query("genre_s:fantasy"))request.shards = new DistributedSearchParams(  shards = List(    "localhost:8984/solr",    "localhost:8985/solr"  ))val response = client.doQuery(request)println(response.groups.toString)


数据导入命令—IH Command)

数据导入的命令:

val request = new DIHCommandRequest(command = "delta-import")val response = client.doDIHCommand(request)println(response.initArgs)println(response.command)println(response.status)println(response.importResponse)println(response.statusMessages)



文档更新

更新Solr索引的XML信息:

添加/更新文档

向Solr中添加文档:

val request = new UpdateRequest()val doc1 = SolrDocument(  writerType = WriterType.JSON,  rawBody = """  { "id" : "978-0641723445",    "cat" : ["book","hardcover"],    "title" : "The Lightning Thief",    "author" : "Rick Riordan",    "series_t" : "Percy Jackson and the Olympians",    "sequence_i" : 1,    "genre_s" : "fantasy",    "inStock" : true,    "price" : 12.50,    "pages_i" : 384  }""")val doc2 = SolrDocument(writerType = WriterType.JSON,rawBody = """  { "id" : "978-1423103349",    "cat" : ["book","paperback"],    "title" : "The Sea of Monsters",    "author" : "Rick Riordan",    "series_t" : "Percy Jackson and the Olympians",    "sequence_i" : 2,    "genre_s" : "fantasy",    "inStock" : true,    "price" : 6.49,    "pages_i" : 304  }""")request.documents = List(doc1, doc2)val response = client.doUpdateDocuments(request)client.doCommit(new UpdateRequest)


删除文档

val request = new DeleteRequest(uniqueKeysToDelete = List("978-0641723445"))val response = client.doDeleteDocuments(request)client.doCommit(new UpdateRequest)Commitval response = client.doCommit(new UpdateRequest())Rollbackval response = client.doRollback(new UpdateRequest())Optimizeval response = client.doOptimize(new UpdateRequest())Add / Update documents in CSV formatval request = new UpdateRequest(  requestBody = "id,name,sequence_i\n0553573403,A Game of Thrones,1\n...")val response = client.doUpdateDocumentsInCSV(request)client.doCommit(new UpdateRequest)


以XML格式更新:

val request = new UpdateRequest(  requestBody = "<optimize/>")val response = client.doUpdateInXML(request)


以JSON格式更新:

val request = new UpdateRequest(  writerType = WriterType.JSON,  requestBody = "{ 7b1debea0390ffbb4e49e2f145a1625ea6ec7011quot;optimize7b1debea0390ffbb4e49e2f145a1625ea6ec7011quot;: { 7b1debea0390ffbb4e49e2f145a1625ea6ec7011quot;waitFlush7b1debea0390ffbb4e49e2f145a1625ea6ec7011quot;:false, 7b1debea0390ffbb4e49e2f145a1625ea6ec7011quot;waitSearcher7b1debea0390ffbb4e49e2f145a1625ea6ec7011quot;:false } }")val response = client.doUpdateInJSON(request)


从更新格式中加载文档

不支持JSON格式

XML格式

val xmlString = "<add><doc><field name=ece0aa4e60e0be0d48ee70d07ac10cec4e21eecaquot;employeeIdece0aa4e60e0be0d48ee70d07ac10cec4e21eecaquot;>05991</field><field name=ece0aa4e60e0be0d48ee70d07ac10cec4e21eecaquot;officeece0aa4e60e0be0d48ee70d07ac10cec4e21eecaquot;>Bridgewater</field>..."val docs = UpdateFormatLoader.fromXMLString(xmlString)docs foreach {  case doc => {    println("employeeId:" + doc.get("employeeId").toString()) // "05991"    println("office:" + doc.get("office").toString()) // "Bridgewater"  }}


CSV格式

val csvString = "id,name,sequence_i\n0553573403,A Game of Thrones,1\n..."val docs = UpdateFormatLoader.fromCSVString(csvString)docs foreach {  case doc => {    println(doc.get("id")) // "0553573403"    println(doc.get("name")) // "A Game of Thrones"    println(doc.get("sequence_i").toIntOrElse(0)) // 1  }}



Ping

val response = client.doPing(new PingRequest())println(response.status) // "OK"

读书人网 >开源软件

热点推荐