【问题标题】:how is solr working with the "catch-all" field _text_?solr 如何处理“catch-all”字段_text_?
【发布时间】:2017-02-12 16:44:07
【问题描述】:

提取文件时,solr 将其内容索引到一个名为 _text_ 的包罗万象的字段。即使您通过fmap.content=my_content_field 提供内容字段,情况也是如此。

但是,如果没有声明 fmap.content 字段,_text_ 字段似乎会在更新时被覆盖。如果声明了fmap.content,则_text_ 字段显然保持不变。

重现这种行为:

SOLR_CORE=test
SOLR_URL=http://192.168.45.153:8983/solr/${SOLR_CORE}
FILENAME=textfile.txt

cat > ${FILENAME} << EOF
Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
EOF

删除核心中的所有文档

curl "${SOLR_URL}/update?commit=true&stream.body=<delete><query>*:*</query></delete>"

添加一个文档,提取并索引filename.txt的内容:

curl "${SOLR_URL}/update/extract?\
literal.id=${FILENAME}\
&fmap.content=my_content_field\
&literal.field_x=initial_text_of_field_x\
&literal.field_y=initial_text_of_field_y\
&commit=true"\
 -F "myfile=@${FILENAME}"

查询包含单词ipsum的文档:

curl "${SOLR_URL}/query?q=_text_:ipsum&fl=id"

更新字段field_x的内容:

curl "${SOLR_URL}/update?commit=true" -d '
[
  {
    "id" : '${FILENAME}',
    "field_x" : {"set" : "new_value"}
  }
]'

查询包含单词ipsum的文档:

curl "${SOLR_URL}/query?q=_text_:ipsum&fl=id"

更新前后的查询给出的结果是按预期找到的文档:

{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"_text_:ipsum",
      "fl":"id"}},
  "response":{"numFound":1,"start":0,"docs":[
      {
        "id":"textfile.txt"}]
  }}

如果添加的文档没有&amp;fmap.content=my_content_field

curl "${SOLR_URL}/update/extract?\
literal.id=${FILENAME}\
&literal.field_x=initial_text_of_field_x\
&literal.field_y=initial_text_of_field_y\
&commit=true"\
 -F "myfile=@${FILENAME}"

更新后的查询(见上)没有找到文档:

curl "${SOLR_URL}/query?q=_text_:ipsum&fl=id"
{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "q":"_text_:ipsum",
      "fl":"id"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}

【问题讨论】:

    标签: solr


    【解决方案1】:

    这里的主要问题是 update 命令必须重建文档,更新它并将其提交回 Lucene 存储层。那是因为,在 Lucene 级别,内容是只写的。 Solr 级别的更新实际上在幕后生成了一个新的 Lucene 文档。

    因此,要重建文档,它需要能够取回字段。如果该字段未存储(或 docValued,我认为),则没有办法这样做。

    text 字段很可能不会被存储,因为它通常会累积许多其他字段的内容以方便默认搜索。所以,它不参与重建,更新的文档错过了它。

    我的猜测是 my_content_field 是用 stored=true 定义的,因此可以包含在重建的文档中并与更新一起保存回来。

    【讨论】:

      猜你喜欢
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2018-01-09
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多